//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension DataSync {
    // MARK: Enums

    public enum AgentStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case offline = "OFFLINE"
        case online = "ONLINE"
        public var description: String { return self.rawValue }
    }

    public enum Atime: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bestEffort = "BEST_EFFORT"
        case none = "NONE"
        public var description: String { return self.rawValue }
    }

    public enum AzureAccessTier: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case archive = "ARCHIVE"
        case cool = "COOL"
        case hot = "HOT"
        public var description: String { return self.rawValue }
    }

    public enum AzureBlobAuthenticationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case sas = "SAS"
        public var description: String { return self.rawValue }
    }

    public enum AzureBlobType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case block = "BLOCK"
        public var description: String { return self.rawValue }
    }

    public enum EfsInTransitEncryption: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case tls12 = "TLS1_2"
        public var description: String { return self.rawValue }
    }

    public enum EndpointType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `public` = "PUBLIC"
        case fips = "FIPS"
        case fipsPrivateLink = "FIPS_PRIVATE_LINK"
        case privateLink = "PRIVATE_LINK"
        public var description: String { return self.rawValue }
    }

    public enum FilterType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case simplePattern = "SIMPLE_PATTERN"
        public var description: String { return self.rawValue }
    }

    public enum Gid: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case both = "BOTH"
        case intValue = "INT_VALUE"
        case name = "NAME"
        case none = "NONE"
        public var description: String { return self.rawValue }
    }

    public enum HdfsAuthenticationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case kerberos = "KERBEROS"
        case simple = "SIMPLE"
        public var description: String { return self.rawValue }
    }

    public enum HdfsDataTransferProtection: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case authentication = "AUTHENTICATION"
        case disabled = "DISABLED"
        case integrity = "INTEGRITY"
        case privacy = "PRIVACY"
        public var description: String { return self.rawValue }
    }

    public enum HdfsRpcProtection: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case authentication = "AUTHENTICATION"
        case disabled = "DISABLED"
        case integrity = "INTEGRITY"
        case privacy = "PRIVACY"
        public var description: String { return self.rawValue }
    }

    public enum LocationFilterName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case creationTime = "CreationTime"
        case locationType = "LocationType"
        case locationUri = "LocationUri"
        public var description: String { return self.rawValue }
    }

    public enum LogLevel: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case basic = "BASIC"
        case off = "OFF"
        case transfer = "TRANSFER"
        public var description: String { return self.rawValue }
    }

    public enum ManifestAction: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case transfer = "TRANSFER"
        public var description: String { return self.rawValue }
    }

    public enum ManifestFormat: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case csv = "CSV"
        public var description: String { return self.rawValue }
    }

    public enum Mtime: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case preserve = "PRESERVE"
        public var description: String { return self.rawValue }
    }

    public enum NfsVersion: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case automatic = "AUTOMATIC"
        case nfs3 = "NFS3"
        case nfs40 = "NFS4_0"
        case nfs41 = "NFS4_1"
        public var description: String { return self.rawValue }
    }

    public enum ObjectStorageServerProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case http = "HTTP"
        case https = "HTTPS"
        public var description: String { return self.rawValue }
    }

    public enum ObjectTags: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case preserve = "PRESERVE"
        public var description: String { return self.rawValue }
    }

    public enum ObjectVersionIds: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case include = "INCLUDE"
        case none = "NONE"
        public var description: String { return self.rawValue }
    }

    public enum Operator: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `in` = "In"
        case beginsWith = "BeginsWith"
        case contains = "Contains"
        case eq = "Equals"
        case ge = "GreaterThanOrEqual"
        case gt = "GreaterThan"
        case le = "LessThanOrEqual"
        case lt = "LessThan"
        case ne = "NotEquals"
        case notContains = "NotContains"
        public var description: String { return self.rawValue }
    }

    public enum OverwriteMode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case always = "ALWAYS"
        case never = "NEVER"
        public var description: String { return self.rawValue }
    }

    public enum PhaseStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case error = "ERROR"
        case pending = "PENDING"
        case success = "SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum PosixPermissions: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case preserve = "PRESERVE"
        public var description: String { return self.rawValue }
    }

    public enum PreserveDeletedFiles: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case preserve = "PRESERVE"
        case remove = "REMOVE"
        public var description: String { return self.rawValue }
    }

    public enum PreserveDevices: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case preserve = "PRESERVE"
        public var description: String { return self.rawValue }
    }

    public enum ReportLevel: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case errorsOnly = "ERRORS_ONLY"
        case successesAndErrors = "SUCCESSES_AND_ERRORS"
        public var description: String { return self.rawValue }
    }

    public enum ReportOutputType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case standard = "STANDARD"
        case summaryOnly = "SUMMARY_ONLY"
        public var description: String { return self.rawValue }
    }

    public enum S3StorageClass: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case deepArchive = "DEEP_ARCHIVE"
        case glacier = "GLACIER"
        case glacierInstantRetrieval = "GLACIER_INSTANT_RETRIEVAL"
        case intelligentTiering = "INTELLIGENT_TIERING"
        case onezoneIa = "ONEZONE_IA"
        case outposts = "OUTPOSTS"
        case standard = "STANDARD"
        case standardIa = "STANDARD_IA"
        public var description: String { return self.rawValue }
    }

    public enum ScheduleDisabledBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case service = "SERVICE"
        case user = "USER"
        public var description: String { return self.rawValue }
    }

    public enum ScheduleStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case disabled = "DISABLED"
        case enabled = "ENABLED"
        public var description: String { return self.rawValue }
    }

    public enum SmbAuthenticationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case kerberos = "KERBEROS"
        case ntlm = "NTLM"
        public var description: String { return self.rawValue }
    }

    public enum SmbSecurityDescriptorCopyFlags: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case ownerDacl = "OWNER_DACL"
        case ownerDaclSacl = "OWNER_DACL_SACL"
        public var description: String { return self.rawValue }
    }

    public enum SmbVersion: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case automatic = "AUTOMATIC"
        case smb1 = "SMB1"
        case smb2 = "SMB2"
        case smb20 = "SMB2_0"
        case smb3 = "SMB3"
        public var description: String { return self.rawValue }
    }

    public enum TaskExecutionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelling = "CANCELLING"
        case error = "ERROR"
        case launching = "LAUNCHING"
        case preparing = "PREPARING"
        case queued = "QUEUED"
        case success = "SUCCESS"
        case transferring = "TRANSFERRING"
        case verifying = "VERIFYING"
        public var description: String { return self.rawValue }
    }

    public enum TaskFilterName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case creationTime = "CreationTime"
        case locationId = "LocationId"
        public var description: String { return self.rawValue }
    }

    public enum TaskMode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case basic = "BASIC"
        case enhanced = "ENHANCED"
        public var description: String { return self.rawValue }
    }

    public enum TaskQueueing: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case disabled = "DISABLED"
        case enabled = "ENABLED"
        public var description: String { return self.rawValue }
    }

    public enum TaskStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case available = "AVAILABLE"
        case creating = "CREATING"
        case queued = "QUEUED"
        case running = "RUNNING"
        case unavailable = "UNAVAILABLE"
        public var description: String { return self.rawValue }
    }

    public enum TransferMode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "ALL"
        case changed = "CHANGED"
        public var description: String { return self.rawValue }
    }

    public enum Uid: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case both = "BOTH"
        case intValue = "INT_VALUE"
        case name = "NAME"
        case none = "NONE"
        public var description: String { return self.rawValue }
    }

    public enum VerifyMode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case none = "NONE"
        case onlyFilesTransferred = "ONLY_FILES_TRANSFERRED"
        case pointInTimeConsistent = "POINT_IN_TIME_CONSISTENT"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AgentListEntry: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of a DataSync agent.
        public let agentArn: String?
        /// The name of an agent.
        public let name: String?
        /// The platform-related details about the agent, such as the version number.
        public let platform: Platform?
        /// The status of an agent.   If the status is ONLINE, the agent is configured properly and ready to use.   If the status is OFFLINE, the agent has been out of contact with DataSync for five minutes or longer. This can happen for a few reasons. For more information, see What do I do if my agent is offline?
        public let status: AgentStatus?

        @inlinable
        public init(agentArn: String? = nil, name: String? = nil, platform: Platform? = nil, status: AgentStatus? = nil) {
            self.agentArn = agentArn
            self.name = name
            self.platform = platform
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case agentArn = "AgentArn"
            case name = "Name"
            case platform = "Platform"
            case status = "Status"
        }
    }

    public struct AzureBlobSasConfiguration: AWSEncodableShape {
        /// Specifies a SAS token that provides permissions to access your Azure Blob Storage. The token is part of the SAS URI string that comes after the storage resource URI and a question mark. A token looks something like this:  sp=r&st=2023-12-20T14:54:52Z&se=2023-12-20T22:54:52Z&spr=https&sv=2021-06-08&sr=c&sig=aBBKDWQvyuVcTPH9EBp%2FXTI9E%2F%2Fmq171%2BZU178wcwqU%3D
        public let token: String

        @inlinable
        public init(token: String) {
            self.token = token
        }

        public func validate(name: String) throws {
            try self.validate(self.token, name: "token", parent: name, max: 255)
            try self.validate(self.token, name: "token", parent: name, min: 1)
            try self.validate(self.token, name: "token", parent: name, pattern: "^.+$")
        }

        private enum CodingKeys: String, CodingKey {
            case token = "Token"
        }
    }

    public struct CancelTaskExecutionRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the task execution to stop.
        public let taskExecutionArn: String

        @inlinable
        public init(taskExecutionArn: String) {
            self.taskExecutionArn = taskExecutionArn
        }

        public func validate(name: String) throws {
            try self.validate(self.taskExecutionArn, name: "taskExecutionArn", parent: name, max: 128)
            try self.validate(self.taskExecutionArn, name: "taskExecutionArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}/execution/exec-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case taskExecutionArn = "TaskExecutionArn"
        }
    }

    public struct CancelTaskExecutionResponse: AWSDecodableShape {
        public init() {}
    }

    public struct CmkSecretConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the ARN for the customer-managed KMS key that DataSync uses to encrypt the DataSync-managed secret stored for SecretArn. DataSync provides this key to Secrets Manager.
        public let kmsKeyArn: String?
        /// Specifies the ARN for the DataSync-managed Secrets Manager secret that that is used to access a specific storage location. This property is generated by DataSync and is read-only. DataSync encrypts this secret with the KMS key that you specify for KmsKeyArn.
        public let secretArn: String?

        @inlinable
        public init(kmsKeyArn: String? = nil, secretArn: String? = nil) {
            self.kmsKeyArn = kmsKeyArn
            self.secretArn = secretArn
        }

        public func validate(name: String) throws {
            try self.validate(self.kmsKeyArn, name: "kmsKeyArn", parent: name, max: 2048)
            try self.validate(self.kmsKeyArn, name: "kmsKeyArn", parent: name, pattern: "^(arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):kms:[a-z\\-0-9]+:[0-9]{12}:key/.*|)$")
            try self.validate(self.secretArn, name: "secretArn", parent: name, max: 2048)
            try self.validate(self.secretArn, name: "secretArn", parent: name, pattern: "^(arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):secretsmanager:[a-z\\-0-9]+:[0-9]{12}:secret:.*|)$")
        }

        private enum CodingKeys: String, CodingKey {
            case kmsKeyArn = "KmsKeyArn"
            case secretArn = "SecretArn"
        }
    }

    public struct CreateAgentRequest: AWSEncodableShape {
        /// Specifies your DataSync agent's activation key. If you don't have an activation key, see Activating your agent.
        public let activationKey: String
        /// Specifies a name for your agent. We recommend specifying a name that you can remember.
        public let agentName: String?
        /// Specifies the Amazon Resource Name (ARN) of the security group that allows traffic between your agent and VPC service endpoint. You can only specify one ARN.
        public let securityGroupArns: [String]?
        /// Specifies the ARN of the subnet where your VPC service endpoint is located. You can only specify one ARN.
        public let subnetArns: [String]?
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least one tag for your agent.
        public let tags: [TagListEntry]?
        /// Specifies the ID of the VPC service endpoint that you're using. For example, a VPC endpoint ID looks like vpce-01234d5aff67890e1.  The VPC service endpoint you use must include the DataSync service name (for example, com.amazonaws.us-east-2.datasync).
        public let vpcEndpointId: String?

        @inlinable
        public init(activationKey: String, agentName: String? = nil, securityGroupArns: [String]? = nil, subnetArns: [String]? = nil, tags: [TagListEntry]? = nil, vpcEndpointId: String? = nil) {
            self.activationKey = activationKey
            self.agentName = agentName
            self.securityGroupArns = securityGroupArns
            self.subnetArns = subnetArns
            self.tags = tags
            self.vpcEndpointId = vpcEndpointId
        }

        public func validate(name: String) throws {
            try self.validate(self.activationKey, name: "activationKey", parent: name, max: 29)
            try self.validate(self.activationKey, name: "activationKey", parent: name, pattern: "^[A-Z0-9]{5}(-[A-Z0-9]{5}){4}$")
            try self.validate(self.agentName, name: "agentName", parent: name, max: 256)
            try self.validate(self.agentName, name: "agentName", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:@/-]+$")
            try self.securityGroupArns?.forEach {
                try validate($0, name: "securityGroupArns[]", parent: name, max: 128)
                try validate($0, name: "securityGroupArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:security-group/sg-[a-f0-9]+$")
            }
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, max: 1)
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, min: 1)
            try self.subnetArns?.forEach {
                try validate($0, name: "subnetArns[]", parent: name, max: 128)
                try validate($0, name: "subnetArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:subnet/.*$")
            }
            try self.validate(self.subnetArns, name: "subnetArns", parent: name, max: 1)
            try self.validate(self.subnetArns, name: "subnetArns", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.vpcEndpointId, name: "vpcEndpointId", parent: name, pattern: "^vpce-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case activationKey = "ActivationKey"
            case agentName = "AgentName"
            case securityGroupArns = "SecurityGroupArns"
            case subnetArns = "SubnetArns"
            case tags = "Tags"
            case vpcEndpointId = "VpcEndpointId"
        }
    }

    public struct CreateAgentResponse: AWSDecodableShape {
        /// The ARN of the agent that you just activated. Use the ListAgents operation to return a list of agents in your Amazon Web Services account and Amazon Web Services Region.
        public let agentArn: String?

        @inlinable
        public init(agentArn: String? = nil) {
            self.agentArn = agentArn
        }

        private enum CodingKeys: String, CodingKey {
            case agentArn = "AgentArn"
        }
    }

    public struct CreateLocationAzureBlobRequest: AWSEncodableShape {
        /// Specifies the access tier that you want your objects or files transferred into. This only applies when using the location as a transfer destination. For more information, see Access tiers.
        public let accessTier: AzureAccessTier?
        /// (Optional) Specifies the Amazon Resource Name (ARN) of the DataSync agent that can connect with your Azure Blob Storage container. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter. You can specify more than one agent. For more information, see Using multiple agents for your transfer.  Make sure you configure this parameter correctly when you first create your storage location. You cannot add or remove agents from a storage location after you create it.
        public let agentArns: [String]?
        /// Specifies the authentication method DataSync uses to access your Azure Blob Storage. DataSync can access blob storage using a shared access signature (SAS).
        public let authenticationType: AzureBlobAuthenticationType
        /// Specifies the type of blob that you want your objects or files to be when transferring them into Azure Blob Storage. Currently, DataSync only supports moving data into Azure Blob Storage as block blobs. For more information on blob types, see the Azure Blob Storage documentation.
        public let blobType: AzureBlobType?
        /// Specifies configuration information for a DataSync-managed secret, which includes the authentication token that DataSync uses to access a specific AzureBlob storage location, with a customer-managed KMS key. When you include this paramater as part of a CreateLocationAzureBlob request, you provide only the KMS key ARN. DataSync uses this KMS key together with the authentication token you specify for SasConfiguration to create a DataSync-managed secret to store the location access credentials. Make sure the DataSync has permission to access the KMS key that you specify.  You can use either CmkSecretConfig (with SasConfiguration) or CustomSecretConfig (without SasConfiguration) to provide credentials for a CreateLocationAzureBlob request. Do not provide both parameters for the same request.
        public let cmkSecretConfig: CmkSecretConfig?
        /// Specifies the URL of the Azure Blob Storage container involved in your transfer.
        public let containerUrl: String
        /// Specifies configuration information for a customer-managed Secrets Manager secret where the authentication token for an AzureBlob storage location is stored in plain text. This configuration includes the secret ARN, and the ARN for an IAM role that provides access to the secret.  You can use either CmkSecretConfig (with SasConfiguration) or CustomSecretConfig (without SasConfiguration) to provide credentials for a CreateLocationAzureBlob request. Do not provide both parameters for the same request.
        public let customSecretConfig: CustomSecretConfig?
        /// Specifies the SAS configuration that allows DataSync to access your Azure Blob Storage.  If you provide an authentication token using SasConfiguration, but do not provide secret configuration details using CmkSecretConfig or CustomSecretConfig, then DataSync stores the token using your Amazon Web Services account's secrets manager secret.
        public let sasConfiguration: AzureBlobSasConfiguration?
        /// Specifies path segments if you want to limit your transfer to a virtual directory in your container (for example, /my/images).
        public let subdirectory: String?
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your transfer location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(accessTier: AzureAccessTier? = nil, agentArns: [String]? = nil, authenticationType: AzureBlobAuthenticationType, blobType: AzureBlobType? = nil, cmkSecretConfig: CmkSecretConfig? = nil, containerUrl: String, customSecretConfig: CustomSecretConfig? = nil, sasConfiguration: AzureBlobSasConfiguration? = nil, subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.accessTier = accessTier
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.blobType = blobType
            self.cmkSecretConfig = cmkSecretConfig
            self.containerUrl = containerUrl
            self.customSecretConfig = customSecretConfig
            self.sasConfiguration = sasConfiguration
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.cmkSecretConfig?.validate(name: "\(name).cmkSecretConfig")
            try self.validate(self.containerUrl, name: "containerUrl", parent: name, max: 325)
            try self.validate(self.containerUrl, name: "containerUrl", parent: name, pattern: "^https:\\/\\/[A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252}\\/[a-z0-9](-?[a-z0-9]){2,62}$")
            try self.customSecretConfig?.validate(name: "\(name).customSecretConfig")
            try self.sasConfiguration?.validate(name: "\(name).sasConfiguration")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 1024)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[\\p{L}\\p{M}\\p{Z}\\p{S}\\p{N}\\p{P}\\p{C}]*$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case accessTier = "AccessTier"
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case blobType = "BlobType"
            case cmkSecretConfig = "CmkSecretConfig"
            case containerUrl = "ContainerUrl"
            case customSecretConfig = "CustomSecretConfig"
            case sasConfiguration = "SasConfiguration"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationAzureBlobResponse: AWSDecodableShape {
        /// The ARN of the Azure Blob Storage transfer location that you created.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationEfsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the access point that DataSync uses to mount your Amazon EFS file system. For more information, see Accessing restricted file systems.
        public let accessPointArn: String?
        /// Specifies the subnet and security groups DataSync uses to connect to one of your Amazon EFS file system's mount targets.
        public let ec2Config: Ec2Config
        /// Specifies the ARN for your Amazon EFS file system.
        public let efsFilesystemArn: String
        /// Specifies an Identity and Access Management (IAM) role that allows DataSync to access your Amazon EFS file system. For information on creating this role, see Creating a DataSync IAM role for file system access.
        public let fileSystemAccessRoleArn: String?
        /// Specifies whether you want DataSync to use Transport Layer Security (TLS) 1.2 encryption when it transfers data to or from your Amazon EFS file system. If you specify an access point using AccessPointArn or an IAM role using FileSystemAccessRoleArn, you must set this parameter to TLS1_2.
        public let inTransitEncryption: EfsInTransitEncryption?
        /// Specifies a mount path for your Amazon EFS file system. This is where DataSync reads or writes data on your file system (depending on if this is a source or destination location). By default, DataSync uses the root directory (or access point if you provide one by using AccessPointArn). You can also include subdirectories using forward slashes (for example, /path/to/folder).
        public let subdirectory: String?
        /// Specifies the key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(accessPointArn: String? = nil, ec2Config: Ec2Config, efsFilesystemArn: String, fileSystemAccessRoleArn: String? = nil, inTransitEncryption: EfsInTransitEncryption? = nil, subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.accessPointArn = accessPointArn
            self.ec2Config = ec2Config
            self.efsFilesystemArn = efsFilesystemArn
            self.fileSystemAccessRoleArn = fileSystemAccessRoleArn
            self.inTransitEncryption = inTransitEncryption
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.accessPointArn, name: "accessPointArn", parent: name, max: 128)
            try self.validate(self.accessPointArn, name: "accessPointArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):elasticfilesystem:[a-z\\-0-9]+:[0-9]{12}:access-point/fsap-[0-9a-f]{8,40}$")
            try self.ec2Config.validate(name: "\(name).ec2Config")
            try self.validate(self.efsFilesystemArn, name: "efsFilesystemArn", parent: name, max: 128)
            try self.validate(self.efsFilesystemArn, name: "efsFilesystemArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):elasticfilesystem:[a-z\\-0-9]*:[0-9]{12}:file-system/fs-.*$")
            try self.validate(self.fileSystemAccessRoleArn, name: "fileSystemAccessRoleArn", parent: name, max: 2048)
            try self.validate(self.fileSystemAccessRoleArn, name: "fileSystemAccessRoleArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case accessPointArn = "AccessPointArn"
            case ec2Config = "Ec2Config"
            case efsFilesystemArn = "EfsFilesystemArn"
            case fileSystemAccessRoleArn = "FileSystemAccessRoleArn"
            case inTransitEncryption = "InTransitEncryption"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationEfsResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the Amazon EFS file system location that you create.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationFsxLustreRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the FSx for Lustre file system.
        public let fsxFilesystemArn: String
        /// Specifies the Amazon Resource Names (ARNs) of up to five security groups that provide access to your FSx for Lustre file system. The security groups must be able to access the file system's ports. The file system must also allow access from the security groups. For information about file system access, see the  Amazon FSx for Lustre User Guide .
        public let securityGroupArns: [String]
        /// Specifies a mount path for your FSx for Lustre file system. The path can include subdirectories. When the location is used as a source, DataSync reads data from the mount path. When the location is used as a destination, DataSync writes data to the mount path. If you don't include this parameter, DataSync uses the file system's root directory (/).
        public let subdirectory: String?
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(fsxFilesystemArn: String, securityGroupArns: [String], subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.fsxFilesystemArn = fsxFilesystemArn
            self.securityGroupArns = securityGroupArns
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.fsxFilesystemArn, name: "fsxFilesystemArn", parent: name, max: 128)
            try self.validate(self.fsxFilesystemArn, name: "fsxFilesystemArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):fsx:[a-z\\-0-9]*:[0-9]{12}:file-system/fs-.*$")
            try self.securityGroupArns.forEach {
                try validate($0, name: "securityGroupArns[]", parent: name, max: 128)
                try validate($0, name: "securityGroupArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:security-group/sg-[a-f0-9]+$")
            }
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, max: 5)
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, min: 1)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case fsxFilesystemArn = "FsxFilesystemArn"
            case securityGroupArns = "SecurityGroupArns"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationFsxLustreResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the FSx for Lustre file system location that you created.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationFsxOntapRequest: AWSEncodableShape {
        public let `protocol`: FsxProtocol
        /// Specifies the Amazon EC2 security groups that provide access to your file system's preferred subnet. The security groups must allow outbound traffic on the following ports (depending on the protocol you use):    Network File System (NFS): TCP ports 111, 635, and 2049    Server Message Block (SMB): TCP port 445   Your file system's security groups must also allow inbound traffic on the same ports.
        public let securityGroupArns: [String]
        /// Specifies the ARN of the storage virtual machine (SVM) in your file system where you want to copy data to or from.
        public let storageVirtualMachineArn: String
        /// Specifies a path to the file share in the SVM where you want to transfer data to or from. You can specify a junction path (also known as a mount point), qtree path (for NFS file shares), or share name (for SMB file shares). For example, your mount path might be /vol1, /vol1/tree1, or /share1.  Don't specify a junction path in the SVM's root volume. For more information, see Managing FSx for ONTAP storage virtual machines in the Amazon FSx for NetApp ONTAP User Guide.
        public let subdirectory: String?
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(protocol: FsxProtocol, securityGroupArns: [String], storageVirtualMachineArn: String, subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.`protocol` = `protocol`
            self.securityGroupArns = securityGroupArns
            self.storageVirtualMachineArn = storageVirtualMachineArn
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.`protocol`.validate(name: "\(name).`protocol`")
            try self.securityGroupArns.forEach {
                try validate($0, name: "securityGroupArns[]", parent: name, max: 128)
                try validate($0, name: "securityGroupArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:security-group/sg-[a-f0-9]+$")
            }
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, max: 5)
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, min: 1)
            try self.validate(self.storageVirtualMachineArn, name: "storageVirtualMachineArn", parent: name, max: 162)
            try self.validate(self.storageVirtualMachineArn, name: "storageVirtualMachineArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):fsx:[a-z\\-0-9]+:[0-9]{12}:storage-virtual-machine/fs-[0-9a-f]+/svm-[0-9a-f]{17,}$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 255)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[^\\u0000\\u0085\\u2028\\u2029\\r\\n]{1,255}$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case `protocol` = "Protocol"
            case securityGroupArns = "SecurityGroupArns"
            case storageVirtualMachineArn = "StorageVirtualMachineArn"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationFsxOntapResponse: AWSDecodableShape {
        /// Specifies the ARN of the FSx for ONTAP file system location that you create.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationFsxOpenZfsRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the FSx for OpenZFS file system.
        public let fsxFilesystemArn: String
        /// The type of protocol that DataSync uses to access your file system.
        public let `protocol`: FsxProtocol
        /// The ARNs of the security groups that are used to configure the FSx for OpenZFS file system.
        public let securityGroupArns: [String]
        /// A subdirectory in the location's path that must begin with /fsx. DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).
        public let subdirectory: String?
        /// The key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(fsxFilesystemArn: String, protocol: FsxProtocol, securityGroupArns: [String], subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.fsxFilesystemArn = fsxFilesystemArn
            self.`protocol` = `protocol`
            self.securityGroupArns = securityGroupArns
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.fsxFilesystemArn, name: "fsxFilesystemArn", parent: name, max: 128)
            try self.validate(self.fsxFilesystemArn, name: "fsxFilesystemArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):fsx:[a-z\\-0-9]*:[0-9]{12}:file-system/fs-.*$")
            try self.`protocol`.validate(name: "\(name).`protocol`")
            try self.securityGroupArns.forEach {
                try validate($0, name: "securityGroupArns[]", parent: name, max: 128)
                try validate($0, name: "securityGroupArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:security-group/sg-[a-f0-9]+$")
            }
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, max: 5)
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, min: 1)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[^\\u0000\\u0085\\u2028\\u2029\\r\\n]{1,4096}$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case fsxFilesystemArn = "FsxFilesystemArn"
            case `protocol` = "Protocol"
            case securityGroupArns = "SecurityGroupArns"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationFsxOpenZfsResponse: AWSDecodableShape {
        /// The ARN of the FSx for OpenZFS file system location that you created.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationFsxWindowsRequest: AWSEncodableShape {
        /// Specifies the name of the Windows domain that the FSx for Windows File Server file system belongs to. If you have multiple Active Directory domains in your environment, configuring this parameter makes sure that DataSync connects to the right file system.
        public let domain: String?
        /// Specifies the Amazon Resource Name (ARN) for the FSx for Windows File Server file system.
        public let fsxFilesystemArn: String
        /// Specifies the password of the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system.
        public let password: String
        /// Specifies the ARNs of the Amazon EC2 security groups that provide access to your file system's preferred subnet. The security groups that you specify must be able to communicate with your file system's security groups. For information about configuring security groups for file system access, see the  Amazon FSx for Windows File Server User Guide .  If you choose a security group that doesn't allow connections from within itself, do one of the following:   Configure the security group to allow it to communicate within itself.   Choose a different security group that can communicate with the mount target's security group.
        public let securityGroupArns: [String]
        /// Specifies a mount path for your file system using forward slashes. This is where DataSync reads or writes data (depending on if this is a source or destination location).
        public let subdirectory: String?
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
        public let tags: [TagListEntry]?
        /// Specifies the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system. For information about choosing a user with the right level of access for your transfer, see required permissions for FSx for Windows File Server locations.
        public let user: String

        @inlinable
        public init(domain: String? = nil, fsxFilesystemArn: String, password: String, securityGroupArns: [String], subdirectory: String? = nil, tags: [TagListEntry]? = nil, user: String) {
            self.domain = domain
            self.fsxFilesystemArn = fsxFilesystemArn
            self.password = password
            self.securityGroupArns = securityGroupArns
            self.subdirectory = subdirectory
            self.tags = tags
            self.user = user
        }

        public func validate(name: String) throws {
            try self.validate(self.domain, name: "domain", parent: name, max: 253)
            try self.validate(self.domain, name: "domain", parent: name, pattern: "^[A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252}$")
            try self.validate(self.fsxFilesystemArn, name: "fsxFilesystemArn", parent: name, max: 128)
            try self.validate(self.fsxFilesystemArn, name: "fsxFilesystemArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):fsx:[a-z\\-0-9]*:[0-9]{12}:file-system/fs-.*$")
            try self.validate(self.password, name: "password", parent: name, max: 104)
            try self.validate(self.password, name: "password", parent: name, pattern: "^.{0,104}$")
            try self.securityGroupArns.forEach {
                try validate($0, name: "securityGroupArns[]", parent: name, max: 128)
                try validate($0, name: "securityGroupArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:security-group/sg-[a-f0-9]+$")
            }
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, max: 5)
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, min: 1)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.user, name: "user", parent: name, max: 104)
            try self.validate(self.user, name: "user", parent: name, pattern: "^[^\\x22\\x5B\\x5D/\\\\:;|=,+*?\\x3C\\x3E]{1,104}$")
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case fsxFilesystemArn = "FsxFilesystemArn"
            case password = "Password"
            case securityGroupArns = "SecurityGroupArns"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
            case user = "User"
        }
    }

    public struct CreateLocationFsxWindowsResponse: AWSDecodableShape {
        /// The ARN of the FSx for Windows File Server file system location you created.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationHdfsRequest: AWSEncodableShape {
        /// The Amazon Resource Names (ARNs) of the DataSync agents that can connect to your HDFS cluster.
        public let agentArns: [String]
        /// The type of authentication used to determine the identity of the user.
        public let authenticationType: HdfsAuthenticationType
        /// The size of data blocks to write into the HDFS cluster. The block size must be a multiple of 512 bytes. The default block size is 128 mebibytes (MiB).
        public let blockSize: Int?
        /// The Kerberos key table (keytab) that contains mappings between the defined Kerberos principal and the encrypted keys. You can load the keytab from a file by providing the file's address.  If KERBEROS is specified for AuthenticationType, this parameter is required.
        public let kerberosKeytab: AWSBase64Data?
        /// The krb5.conf file that contains the Kerberos configuration information. You can load the krb5.conf file by providing the file's address. If you're using the CLI, it performs the base64 encoding for you. Otherwise, provide the base64-encoded text.   If KERBEROS is specified for AuthenticationType, this parameter is required.
        public let kerberosKrb5Conf: AWSBase64Data?
        /// The Kerberos principal with access to the files and folders on the HDFS cluster.   If KERBEROS is specified for AuthenticationType, this parameter is required.
        public let kerberosPrincipal: String?
        /// The URI of the HDFS cluster's Key Management Server (KMS).
        public let kmsKeyProviderUri: String?
        /// The NameNode that manages the HDFS namespace. The NameNode performs operations such as opening, closing, and renaming files and directories. The NameNode contains the information to map blocks of data to the DataNodes. You can use only one NameNode.
        public let nameNodes: [HdfsNameNode]
        /// The Quality of Protection (QOP) configuration specifies the Remote Procedure Call (RPC) and data transfer protection settings configured on the Hadoop Distributed File System (HDFS) cluster. If QopConfiguration isn't specified, RpcProtection and DataTransferProtection default to PRIVACY. If you set RpcProtection or DataTransferProtection, the other parameter assumes the same value.
        public let qopConfiguration: QopConfiguration?
        /// The number of DataNodes to replicate the data to when writing to the HDFS cluster. By default, data is replicated to three DataNodes.
        public let replicationFactor: Int?
        /// The user name used to identify the client on the host operating system.   If SIMPLE is specified for AuthenticationType, this parameter is required.
        public let simpleUser: String?
        /// A subdirectory in the HDFS cluster. This subdirectory is used to read data from or write data to the HDFS cluster. If the subdirectory isn't specified, it will default to /.
        public let subdirectory: String?
        /// The key-value pair that represents the tag that you want to add to the location. The value can be an empty string. We recommend using tags to name your resources.
        public let tags: [TagListEntry]?

        @inlinable
        public init(agentArns: [String], authenticationType: HdfsAuthenticationType, blockSize: Int? = nil, kerberosKeytab: AWSBase64Data? = nil, kerberosKrb5Conf: AWSBase64Data? = nil, kerberosPrincipal: String? = nil, kmsKeyProviderUri: String? = nil, nameNodes: [HdfsNameNode], qopConfiguration: QopConfiguration? = nil, replicationFactor: Int? = nil, simpleUser: String? = nil, subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.blockSize = blockSize
            self.kerberosKeytab = kerberosKeytab
            self.kerberosKrb5Conf = kerberosKrb5Conf
            self.kerberosPrincipal = kerberosPrincipal
            self.kmsKeyProviderUri = kmsKeyProviderUri
            self.nameNodes = nameNodes
            self.qopConfiguration = qopConfiguration
            self.replicationFactor = replicationFactor
            self.simpleUser = simpleUser
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.agentArns.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.validate(self.blockSize, name: "blockSize", parent: name, max: 1073741824)
            try self.validate(self.blockSize, name: "blockSize", parent: name, min: 1048576)
            try self.validate(self.kerberosKeytab, name: "kerberosKeytab", parent: name, max: 65536)
            try self.validate(self.kerberosKrb5Conf, name: "kerberosKrb5Conf", parent: name, max: 131072)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, max: 256)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, min: 1)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, pattern: "^.+$")
            try self.validate(self.kmsKeyProviderUri, name: "kmsKeyProviderUri", parent: name, max: 255)
            try self.validate(self.kmsKeyProviderUri, name: "kmsKeyProviderUri", parent: name, min: 1)
            try self.validate(self.kmsKeyProviderUri, name: "kmsKeyProviderUri", parent: name, pattern: "^kms:\\/\\/http[s]?@(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-]*[A-Za-z0-9])(;(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-]*[A-Za-z0-9]))*:[0-9]{1,5}\\/kms$")
            try self.nameNodes.forEach {
                try $0.validate(name: "\(name).nameNodes[]")
            }
            try self.validate(self.nameNodes, name: "nameNodes", parent: name, min: 1)
            try self.validate(self.replicationFactor, name: "replicationFactor", parent: name, max: 512)
            try self.validate(self.replicationFactor, name: "replicationFactor", parent: name, min: 1)
            try self.validate(self.simpleUser, name: "simpleUser", parent: name, max: 256)
            try self.validate(self.simpleUser, name: "simpleUser", parent: name, min: 1)
            try self.validate(self.simpleUser, name: "simpleUser", parent: name, pattern: "^[_.A-Za-z0-9][-_.A-Za-z0-9]*$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case blockSize = "BlockSize"
            case kerberosKeytab = "KerberosKeytab"
            case kerberosKrb5Conf = "KerberosKrb5Conf"
            case kerberosPrincipal = "KerberosPrincipal"
            case kmsKeyProviderUri = "KmsKeyProviderUri"
            case nameNodes = "NameNodes"
            case qopConfiguration = "QopConfiguration"
            case replicationFactor = "ReplicationFactor"
            case simpleUser = "SimpleUser"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationHdfsResponse: AWSDecodableShape {
        /// The ARN of the source HDFS cluster location that you create.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationNfsRequest: AWSEncodableShape {
        /// Specifies the options that DataSync can use to mount your NFS file server.
        public let mountOptions: NfsMountOptions?
        /// Specifies the Amazon Resource Name (ARN) of the DataSync agent that can connect to your NFS file server. You can specify more than one agent. For more information, see Using multiple DataSync agents.
        public let onPremConfig: OnPremConfig
        /// Specifies the DNS name or IP address (IPv4 or IPv6) of the NFS file server that your DataSync agent connects to.
        public let serverHostname: String
        /// Specifies the export path in your NFS file server that you want DataSync to mount. This path (or a subdirectory of the path) is where DataSync transfers data to or from. For information on configuring an export for DataSync, see Accessing NFS file servers.
        public let subdirectory: String
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(mountOptions: NfsMountOptions? = nil, onPremConfig: OnPremConfig, serverHostname: String, subdirectory: String, tags: [TagListEntry]? = nil) {
            self.mountOptions = mountOptions
            self.onPremConfig = onPremConfig
            self.serverHostname = serverHostname
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.onPremConfig.validate(name: "\(name).onPremConfig")
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, max: 255)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-:]*[A-Za-z0-9])$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case mountOptions = "MountOptions"
            case onPremConfig = "OnPremConfig"
            case serverHostname = "ServerHostname"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationNfsResponse: AWSDecodableShape {
        /// The ARN of the transfer location that you created for your NFS file server.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationObjectStorageRequest: AWSEncodableShape {
        /// Specifies the access key (for example, a user name) if credentials are required to authenticate with the object storage server.
        public let accessKey: String?
        /// (Optional) Specifies the Amazon Resource Names (ARNs) of the DataSync agents that can connect with your object storage system. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter.  Make sure you configure this parameter correctly when you first create your storage location. You cannot add or remove agents from a storage location after you create it.
        public let agentArns: [String]?
        /// Specifies the name of the object storage bucket involved in the transfer.
        public let bucketName: String
        /// Specifies configuration information for a DataSync-managed secret, which includes the SecretKey that DataSync uses to access a specific object storage location, with a customer-managed KMS key. When you include this paramater as part of a CreateLocationObjectStorage request, you provide only the KMS key ARN. DataSync uses this KMS key together with the value you specify for the SecretKey parameter to create a DataSync-managed secret to store the location access credentials. Make sure the DataSync has permission to access the KMS key that you specify.  You can use either CmkSecretConfig (with SecretKey) or CustomSecretConfig (without SecretKey) to provide credentials for a CreateLocationObjectStorage request. Do not provide both parameters for the same request.
        public let cmkSecretConfig: CmkSecretConfig?
        /// Specifies configuration information for a customer-managed Secrets Manager secret where the secret key for a specific object storage location is stored in plain text. This configuration includes the secret ARN, and the ARN for an IAM role that provides access to the secret.  You can use either CmkSecretConfig (with SecretKey) or CustomSecretConfig (without SecretKey) to provide credentials for a CreateLocationObjectStorage request. Do not provide both parameters for the same request.
        public let customSecretConfig: CustomSecretConfig?
        /// Specifies the secret key (for example, a password) if credentials are required to authenticate with the object storage server.  If you provide a secret using SecretKey, but do not provide secret configuration details using CmkSecretConfig or CustomSecretConfig, then DataSync stores the token using your Amazon Web Services account's Secrets Manager secret.
        public let secretKey: String?
        /// Specifies a certificate chain for DataSync to authenticate with your object storage system if the system uses a private or self-signed certificate authority (CA). You must specify a single .pem file with a full certificate chain (for example, file:///home/user/.ssh/object_storage_certificates.pem). The certificate chain might include:   The object storage system's certificate   All intermediate certificates (if there are any)   The root certificate of the signing CA   You can concatenate your certificates into a .pem file (which can be up to 32768 bytes before base64 encoding). The following example cat command creates an object_storage_certificates.pem file that includes three certificates:  cat object_server_certificate.pem intermediate_certificate.pem ca_root_certificate.pem > object_storage_certificates.pem  To use this parameter, configure ServerProtocol to HTTPS.
        public let serverCertificate: AWSBase64Data?
        /// Specifies the domain name or IP address (IPv4 or IPv6) of the object storage server that your DataSync agent connects to.
        public let serverHostname: String
        /// Specifies the port that your object storage server accepts inbound network traffic on (for example, port 443).
        public let serverPort: Int?
        /// Specifies the protocol that your object storage server uses to communicate. If not specified, the default value is HTTPS.
        public let serverProtocol: ObjectStorageServerProtocol?
        /// Specifies the object prefix for your object storage server. If this is a source location, DataSync only copies objects with this prefix. If this is a destination location, DataSync writes all objects with this prefix.
        public let subdirectory: String?
        /// Specifies the key-value pair that represents a tag that you want to add to the resource. Tags can help you manage, filter, and search for your resources. We recommend creating a name tag for your location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(accessKey: String? = nil, agentArns: [String]? = nil, bucketName: String, cmkSecretConfig: CmkSecretConfig? = nil, customSecretConfig: CustomSecretConfig? = nil, secretKey: String? = nil, serverCertificate: AWSBase64Data? = nil, serverHostname: String, serverPort: Int? = nil, serverProtocol: ObjectStorageServerProtocol? = nil, subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.accessKey = accessKey
            self.agentArns = agentArns
            self.bucketName = bucketName
            self.cmkSecretConfig = cmkSecretConfig
            self.customSecretConfig = customSecretConfig
            self.secretKey = secretKey
            self.serverCertificate = serverCertificate
            self.serverHostname = serverHostname
            self.serverPort = serverPort
            self.serverProtocol = serverProtocol
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.accessKey, name: "accessKey", parent: name, max: 200)
            try self.validate(self.accessKey, name: "accessKey", parent: name, pattern: "^.*$")
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 63)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\.\\(\\)\\$\\p{Zs}]+$")
            try self.cmkSecretConfig?.validate(name: "\(name).cmkSecretConfig")
            try self.customSecretConfig?.validate(name: "\(name).customSecretConfig")
            try self.validate(self.secretKey, name: "secretKey", parent: name, max: 200)
            try self.validate(self.secretKey, name: "secretKey", parent: name, pattern: "^.*$")
            try self.validate(self.serverCertificate, name: "serverCertificate", parent: name, max: 32768)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, max: 255)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-:]*[A-Za-z0-9])$")
            try self.validate(self.serverPort, name: "serverPort", parent: name, max: 65536)
            try self.validate(self.serverPort, name: "serverPort", parent: name, min: 1)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case accessKey = "AccessKey"
            case agentArns = "AgentArns"
            case bucketName = "BucketName"
            case cmkSecretConfig = "CmkSecretConfig"
            case customSecretConfig = "CustomSecretConfig"
            case secretKey = "SecretKey"
            case serverCertificate = "ServerCertificate"
            case serverHostname = "ServerHostname"
            case serverPort = "ServerPort"
            case serverProtocol = "ServerProtocol"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationObjectStorageResponse: AWSDecodableShape {
        /// Specifies the ARN of the object storage system location that you create.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationS3Request: AWSEncodableShape {
        /// (Amazon S3 on Outposts only) Specifies the Amazon Resource Name (ARN) of the DataSync agent on your Outpost. For more information, see Deploy your DataSync agent on Outposts.
        public let agentArns: [String]?
        /// Specifies the ARN of the S3 bucket that you want to use as a location. (When creating your DataSync task later, you specify whether this location is a transfer source or destination.)  If your S3 bucket is located on an Outposts resource, you must specify an Amazon S3 access point. For more information, see Managing data access with Amazon S3 access points in the Amazon S3 User Guide.
        public let s3BucketArn: String
        public let s3Config: S3Config
        /// Specifies the storage class that you want your objects to use when Amazon S3 is a transfer destination. For buckets in Amazon Web Services Regions, the storage class defaults to STANDARD. For buckets on Outposts, the storage class defaults to OUTPOSTS. For more information, see Storage class considerations with Amazon S3 transfers.
        public let s3StorageClass: S3StorageClass?
        /// Specifies a prefix in the S3 bucket that DataSync reads from or writes to (depending on whether the bucket is a source or destination location).  DataSync can't transfer objects with a prefix that begins with a slash (/) or includes //, /./, or /../ patterns. For example:    /photos     photos//2006/January     photos/./2006/February     photos/../2006/March
        public let subdirectory: String?
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your transfer location.
        public let tags: [TagListEntry]?

        @inlinable
        public init(agentArns: [String]? = nil, s3BucketArn: String, s3Config: S3Config, s3StorageClass: S3StorageClass? = nil, subdirectory: String? = nil, tags: [TagListEntry]? = nil) {
            self.agentArns = agentArns
            self.s3BucketArn = s3BucketArn
            self.s3Config = s3Config
            self.s3StorageClass = s3StorageClass
            self.subdirectory = subdirectory
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.validate(self.s3BucketArn, name: "s3BucketArn", parent: name, max: 268)
            try self.validate(self.s3BucketArn, name: "s3BucketArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3:[a-z\\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\\-.]{1,63}$|^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3-outposts:[a-z\\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\\-]{1,63}$|^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3:::[a-zA-Z0-9.\\-_]{1,255}$")
            try self.s3Config.validate(name: "\(name).s3Config")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case s3BucketArn = "S3BucketArn"
            case s3Config = "S3Config"
            case s3StorageClass = "S3StorageClass"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
        }
    }

    public struct CreateLocationS3Response: AWSDecodableShape {
        /// The ARN of the S3 location that you created.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateLocationSmbRequest: AWSEncodableShape {
        /// Specifies the DataSync agent (or agents) that can connect to your SMB file server. You specify an agent by using its Amazon Resource Name (ARN).
        public let agentArns: [String]
        /// Specifies the authentication protocol that DataSync uses to connect to your SMB file server. DataSync supports NTLM (default) and KERBEROS authentication. For more information, see Providing DataSync access to SMB file servers.
        public let authenticationType: SmbAuthenticationType?
        /// Specifies the IPv4 or IPv6 addresses for the DNS servers that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to KERBEROS. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right SMB file server.
        public let dnsIpAddresses: [String]?
        /// Specifies the Windows domain name that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to NTLM. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right file server.
        public let domain: String?
        /// Specifies your Kerberos key table (keytab) file, which includes mappings between your Kerberos principal and encryption keys. To avoid task execution errors, make sure that the Kerberos principal that you use to create the keytab file matches exactly what you specify for KerberosPrincipal.
        public let kerberosKeytab: AWSBase64Data?
        /// Specifies a Kerberos configuration file (krb5.conf) that defines your Kerberos realm configuration. The file must be base64 encoded. If you're using the CLI, the encoding is done for you.
        public let kerberosKrb5Conf: AWSBase64Data?
        /// Specifies a Kerberos principal, which is an identity in your Kerberos realm that has permission to access the files, folders, and file metadata in your SMB file server. A Kerberos principal might look like HOST/kerberosuser@MYDOMAIN.ORG. Principal names are case sensitive. Your DataSync task execution will fail if the principal that you specify for this parameter doesn’t exactly match the principal that you use to create the keytab file.
        public let kerberosPrincipal: String?
        /// Specifies the version of the SMB protocol that DataSync uses to access your SMB file server.
        public let mountOptions: SmbMountOptions?
        /// Specifies the password of the user who can mount your SMB file server and has permission to access the files and folders involved in your transfer. This parameter applies only if AuthenticationType is set to NTLM.
        public let password: String?
        /// Specifies the domain name or IP address (IPv4 or IPv6) of the SMB file server that your DataSync agent connects to.  If you're using Kerberos authentication, you must specify a domain name.
        public let serverHostname: String
        /// Specifies the name of the share exported by your SMB file server where DataSync will read or write data. You can include a subdirectory in the share path (for example, /path/to/subdirectory). Make sure that other SMB clients in your network can also mount this path. To copy all data in the subdirectory, DataSync must be able to mount the SMB share and access all of its data. For more information, see Providing DataSync access to SMB file servers.
        public let subdirectory: String
        /// Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
        public let tags: [TagListEntry]?
        /// Specifies the user that can mount and access the files, folders, and file metadata in your SMB file server. This parameter applies only if AuthenticationType is set to NTLM. For information about choosing a user with the right level of access for your transfer, see Providing DataSync access to SMB file servers.
        public let user: String?

        @inlinable
        public init(agentArns: [String], authenticationType: SmbAuthenticationType? = nil, dnsIpAddresses: [String]? = nil, domain: String? = nil, kerberosKeytab: AWSBase64Data? = nil, kerberosKrb5Conf: AWSBase64Data? = nil, kerberosPrincipal: String? = nil, mountOptions: SmbMountOptions? = nil, password: String? = nil, serverHostname: String, subdirectory: String, tags: [TagListEntry]? = nil, user: String? = nil) {
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.dnsIpAddresses = dnsIpAddresses
            self.domain = domain
            self.kerberosKeytab = kerberosKeytab
            self.kerberosKrb5Conf = kerberosKrb5Conf
            self.kerberosPrincipal = kerberosPrincipal
            self.mountOptions = mountOptions
            self.password = password
            self.serverHostname = serverHostname
            self.subdirectory = subdirectory
            self.tags = tags
            self.user = user
        }

        public func validate(name: String) throws {
            try self.agentArns.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.dnsIpAddresses?.forEach {
                try validate($0, name: "dnsIpAddresses[]", parent: name, max: 39)
                try validate($0, name: "dnsIpAddresses[]", parent: name, min: 7)
                try validate($0, name: "dnsIpAddresses[]", parent: name, pattern: "^\\A((25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}))\\z$")
            }
            try self.validate(self.dnsIpAddresses, name: "dnsIpAddresses", parent: name, max: 2)
            try self.validate(self.domain, name: "domain", parent: name, max: 253)
            try self.validate(self.domain, name: "domain", parent: name, pattern: "^[A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252}$")
            try self.validate(self.kerberosKeytab, name: "kerberosKeytab", parent: name, max: 65536)
            try self.validate(self.kerberosKrb5Conf, name: "kerberosKrb5Conf", parent: name, max: 131072)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, max: 256)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, min: 1)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, pattern: "^.+$")
            try self.validate(self.password, name: "password", parent: name, max: 104)
            try self.validate(self.password, name: "password", parent: name, pattern: "^.{0,104}$")
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, max: 255)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-:]*[A-Za-z0-9])$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.user, name: "user", parent: name, max: 104)
            try self.validate(self.user, name: "user", parent: name, pattern: "^[^\\x22\\x5B\\x5D/\\\\:;|=,+*?\\x3C\\x3E]{1,104}$")
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case dnsIpAddresses = "DnsIpAddresses"
            case domain = "Domain"
            case kerberosKeytab = "KerberosKeytab"
            case kerberosKrb5Conf = "KerberosKrb5Conf"
            case kerberosPrincipal = "KerberosPrincipal"
            case mountOptions = "MountOptions"
            case password = "Password"
            case serverHostname = "ServerHostname"
            case subdirectory = "Subdirectory"
            case tags = "Tags"
            case user = "User"
        }
    }

    public struct CreateLocationSmbResponse: AWSDecodableShape {
        /// The ARN of the SMB location that you created.
        public let locationArn: String?

        @inlinable
        public init(locationArn: String? = nil) {
            self.locationArn = locationArn
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct CreateTaskRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of an Amazon CloudWatch log group for monitoring your task. For Enhanced mode tasks, you don't need to specify anything. DataSync automatically sends logs to a CloudWatch log group named /aws/datasync.
        public let cloudWatchLogGroupArn: String?
        /// Specifies the ARN of your transfer's destination location.
        public let destinationLocationArn: String
        /// Specifies exclude filters that define the files, objects, and folders in your source location that you don't want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
        public let excludes: [FilterRule]?
        /// Specifies include filters that define the files, objects, and folders in your source location that you want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
        public let includes: [FilterRule]?
        /// Configures a manifest, which is a list of files or objects that you want DataSync to transfer. For more information and configuration examples, see Specifying what DataSync transfers by using a manifest. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission.
        public let manifestConfig: ManifestConfig?
        /// Specifies the name of your task.
        public let name: String?
        /// Specifies your task's settings, such as preserving file metadata, verifying data integrity, among other options.
        public let options: Options?
        /// Specifies a schedule for when you want your task to run. For more information, see Scheduling your task.
        public let schedule: TaskSchedule?
        /// Specifies the ARN of your transfer's source location.
        public let sourceLocationArn: String
        /// Specifies the tags that you want to apply to your task.  Tags are key-value pairs that help you manage, filter, and search for your DataSync resources.
        public let tags: [TagListEntry]?
        /// Specifies one of the following task modes for your data transfer:    ENHANCED - Transfer virtually unlimited numbers of objects with higher performance than Basic mode. Enhanced mode tasks optimize the data transfer process by listing, preparing, transferring, and verifying data in parallel. Enhanced mode is currently available for transfers between Amazon S3 locations, transfers between Azure Blob and Amazon S3 without an agent, and transfers between other clouds and Amazon S3 without an agent.  To create an Enhanced mode task, the IAM role that you use to call the CreateTask operation must have the iam:CreateServiceLinkedRole permission.     BASIC (default) - Transfer files or objects between Amazon Web Services storage and all other supported DataSync locations. Basic mode tasks are subject to quotas on the number of files, objects, and directories in a dataset. Basic mode sequentially prepares, transfers, and verifies data, making it slower than Enhanced mode for most workloads.   For more information, see Understanding task mode differences.
        public let taskMode: TaskMode?
        /// Specifies how you want to configure a task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission.
        public let taskReportConfig: TaskReportConfig?

        @inlinable
        public init(cloudWatchLogGroupArn: String? = nil, destinationLocationArn: String, excludes: [FilterRule]? = nil, includes: [FilterRule]? = nil, manifestConfig: ManifestConfig? = nil, name: String? = nil, options: Options? = nil, schedule: TaskSchedule? = nil, sourceLocationArn: String, tags: [TagListEntry]? = nil, taskMode: TaskMode? = nil, taskReportConfig: TaskReportConfig? = nil) {
            self.cloudWatchLogGroupArn = cloudWatchLogGroupArn
            self.destinationLocationArn = destinationLocationArn
            self.excludes = excludes
            self.includes = includes
            self.manifestConfig = manifestConfig
            self.name = name
            self.options = options
            self.schedule = schedule
            self.sourceLocationArn = sourceLocationArn
            self.tags = tags
            self.taskMode = taskMode
            self.taskReportConfig = taskReportConfig
        }

        public func validate(name: String) throws {
            try self.validate(self.cloudWatchLogGroupArn, name: "cloudWatchLogGroupArn", parent: name, max: 562)
            try self.validate(self.cloudWatchLogGroupArn, name: "cloudWatchLogGroupArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):logs:[a-z\\-0-9]+:[0-9]{12}:log-group:([^:\\*]*)(:\\*)?$")
            try self.validate(self.destinationLocationArn, name: "destinationLocationArn", parent: name, max: 128)
            try self.validate(self.destinationLocationArn, name: "destinationLocationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.excludes?.forEach {
                try $0.validate(name: "\(name).excludes[]")
            }
            try self.validate(self.excludes, name: "excludes", parent: name, max: 1)
            try self.includes?.forEach {
                try $0.validate(name: "\(name).includes[]")
            }
            try self.validate(self.includes, name: "includes", parent: name, max: 1)
            try self.manifestConfig?.validate(name: "\(name).manifestConfig")
            try self.validate(self.name, name: "name", parent: name, max: 256)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:@/-]+$")
            try self.options?.validate(name: "\(name).options")
            try self.schedule?.validate(name: "\(name).schedule")
            try self.validate(self.sourceLocationArn, name: "sourceLocationArn", parent: name, max: 128)
            try self.validate(self.sourceLocationArn, name: "sourceLocationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.taskReportConfig?.validate(name: "\(name).taskReportConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogGroupArn = "CloudWatchLogGroupArn"
            case destinationLocationArn = "DestinationLocationArn"
            case excludes = "Excludes"
            case includes = "Includes"
            case manifestConfig = "ManifestConfig"
            case name = "Name"
            case options = "Options"
            case schedule = "Schedule"
            case sourceLocationArn = "SourceLocationArn"
            case tags = "Tags"
            case taskMode = "TaskMode"
            case taskReportConfig = "TaskReportConfig"
        }
    }

    public struct CreateTaskResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the task.
        public let taskArn: String?

        @inlinable
        public init(taskArn: String? = nil) {
            self.taskArn = taskArn
        }

        private enum CodingKeys: String, CodingKey {
            case taskArn = "TaskArn"
        }
    }

    public struct CustomSecretConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the ARN for the Identity and Access Management role that DataSync uses to access the secret specified for SecretArn.
        public let secretAccessRoleArn: String?
        /// Specifies the ARN for an Secrets Manager secret.
        public let secretArn: String?

        @inlinable
        public init(secretAccessRoleArn: String? = nil, secretArn: String? = nil) {
            self.secretAccessRoleArn = secretAccessRoleArn
            self.secretArn = secretArn
        }

        public func validate(name: String) throws {
            try self.validate(self.secretAccessRoleArn, name: "secretAccessRoleArn", parent: name, max: 2048)
            try self.validate(self.secretAccessRoleArn, name: "secretAccessRoleArn", parent: name, pattern: "^(arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/[a-zA-Z0-9+=,.@_-]+|)$")
            try self.validate(self.secretArn, name: "secretArn", parent: name, max: 2048)
            try self.validate(self.secretArn, name: "secretArn", parent: name, pattern: "^(arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):secretsmanager:[a-z\\-0-9]+:[0-9]{12}:secret:.*|)$")
        }

        private enum CodingKeys: String, CodingKey {
            case secretAccessRoleArn = "SecretAccessRoleArn"
            case secretArn = "SecretArn"
        }
    }

    public struct DeleteAgentRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the agent to delete. Use the ListAgents operation to return a list of agents for your account and Amazon Web Services Region.
        public let agentArn: String

        @inlinable
        public init(agentArn: String) {
            self.agentArn = agentArn
        }

        public func validate(name: String) throws {
            try self.validate(self.agentArn, name: "agentArn", parent: name, max: 128)
            try self.validate(self.agentArn, name: "agentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case agentArn = "AgentArn"
        }
    }

    public struct DeleteAgentResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteLocationRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the location to delete.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DeleteLocationResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteTaskRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the task that you want to delete.
        public let taskArn: String

        @inlinable
        public init(taskArn: String) {
            self.taskArn = taskArn
        }

        public func validate(name: String) throws {
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 128)
            try self.validate(self.taskArn, name: "taskArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case taskArn = "TaskArn"
        }
    }

    public struct DeleteTaskResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DescribeAgentRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the DataSync agent that you want information about.
        public let agentArn: String

        @inlinable
        public init(agentArn: String) {
            self.agentArn = agentArn
        }

        public func validate(name: String) throws {
            try self.validate(self.agentArn, name: "agentArn", parent: name, max: 128)
            try self.validate(self.agentArn, name: "agentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case agentArn = "AgentArn"
        }
    }

    public struct DescribeAgentResponse: AWSDecodableShape {
        /// The ARN of the agent.
        public let agentArn: String?
        /// The time that the agent was activated.
        public let creationTime: Date?
        /// The type of service endpoint that your agent is connected to.
        public let endpointType: EndpointType?
        /// The last time that the agent was communicating with the DataSync service.
        public let lastConnectionTime: Date?
        /// The name of the agent.
        public let name: String?
        /// The platform-related details about the agent, such as the version number.
        public let platform: Platform?
        /// The network configuration that the agent uses when connecting to a VPC service endpoint.
        public let privateLinkConfig: PrivateLinkConfig?
        /// The status of the agent.   If the status is ONLINE, the agent is configured properly and ready to use.   If the status is OFFLINE, the agent has been out of contact with DataSync for five minutes or longer. This can happen for a few reasons. For more information, see What do I do if my agent is offline?
        public let status: AgentStatus?

        @inlinable
        public init(agentArn: String? = nil, creationTime: Date? = nil, endpointType: EndpointType? = nil, lastConnectionTime: Date? = nil, name: String? = nil, platform: Platform? = nil, privateLinkConfig: PrivateLinkConfig? = nil, status: AgentStatus? = nil) {
            self.agentArn = agentArn
            self.creationTime = creationTime
            self.endpointType = endpointType
            self.lastConnectionTime = lastConnectionTime
            self.name = name
            self.platform = platform
            self.privateLinkConfig = privateLinkConfig
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case agentArn = "AgentArn"
            case creationTime = "CreationTime"
            case endpointType = "EndpointType"
            case lastConnectionTime = "LastConnectionTime"
            case name = "Name"
            case platform = "Platform"
            case privateLinkConfig = "PrivateLinkConfig"
            case status = "Status"
        }
    }

    public struct DescribeLocationAzureBlobRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of your Azure Blob Storage transfer location.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationAzureBlobResponse: AWSDecodableShape {
        /// The access tier that you want your objects or files transferred into. This only applies when using the location as a transfer destination. For more information, see Access tiers.
        public let accessTier: AzureAccessTier?
        /// The ARNs of the DataSync agents that can connect with your Azure Blob Storage container.
        public let agentArns: [String]?
        /// The authentication method DataSync uses to access your Azure Blob Storage. DataSync can access blob storage using a shared access signature (SAS).
        public let authenticationType: AzureBlobAuthenticationType?
        /// The type of blob that you want your objects or files to be when transferring them into Azure Blob Storage. Currently, DataSync only supports moving data into Azure Blob Storage as block blobs. For more information on blob types, see the Azure Blob Storage documentation.
        public let blobType: AzureBlobType?
        /// Describes configuration information for a DataSync-managed secret, such as an authentication token that DataSync uses to access a specific storage location, with a customer-managed KMS key.
        public let cmkSecretConfig: CmkSecretConfig?
        /// The time that your Azure Blob Storage transfer location was created.
        public let creationTime: Date?
        /// Describes configuration information for a customer-managed secret, such as an authentication token that DataSync uses to access a specific storage location, with a customer-managed KMS key.
        public let customSecretConfig: CustomSecretConfig?
        /// The ARN of your Azure Blob Storage transfer location.
        public let locationArn: String?
        /// The URL of the Azure Blob Storage container involved in your transfer.
        public let locationUri: String?
        /// Describes configuration information for a DataSync-managed secret, such as an authentication token that DataSync uses to access a specific storage location. DataSync uses the default Amazon Web Services-managed KMS key to encrypt this secret in Secrets Manager.
        public let managedSecretConfig: ManagedSecretConfig?

        @inlinable
        public init(accessTier: AzureAccessTier? = nil, agentArns: [String]? = nil, authenticationType: AzureBlobAuthenticationType? = nil, blobType: AzureBlobType? = nil, cmkSecretConfig: CmkSecretConfig? = nil, creationTime: Date? = nil, customSecretConfig: CustomSecretConfig? = nil, locationArn: String? = nil, locationUri: String? = nil, managedSecretConfig: ManagedSecretConfig? = nil) {
            self.accessTier = accessTier
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.blobType = blobType
            self.cmkSecretConfig = cmkSecretConfig
            self.creationTime = creationTime
            self.customSecretConfig = customSecretConfig
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.managedSecretConfig = managedSecretConfig
        }

        private enum CodingKeys: String, CodingKey {
            case accessTier = "AccessTier"
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case blobType = "BlobType"
            case cmkSecretConfig = "CmkSecretConfig"
            case creationTime = "CreationTime"
            case customSecretConfig = "CustomSecretConfig"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case managedSecretConfig = "ManagedSecretConfig"
        }
    }

    public struct DescribeLocationEfsRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the Amazon EFS file system location that you want information about.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationEfsResponse: AWSDecodableShape {
        /// The ARN of the access point that DataSync uses to access the Amazon EFS file system. For more information, see Accessing restricted file systems.
        public let accessPointArn: String?
        /// The time that the location was created.
        public let creationTime: Date?
        public let ec2Config: Ec2Config?
        /// The Identity and Access Management (IAM) role that allows DataSync to access your Amazon EFS file system. For more information, see Creating a DataSync IAM role for file system access.
        public let fileSystemAccessRoleArn: String?
        /// Indicates whether DataSync uses Transport Layer Security (TLS) encryption when transferring data to or from the Amazon EFS file system.
        public let inTransitEncryption: EfsInTransitEncryption?
        /// The ARN of the Amazon EFS file system location.
        public let locationArn: String?
        /// The URL of the Amazon EFS file system location.
        public let locationUri: String?

        @inlinable
        public init(accessPointArn: String? = nil, creationTime: Date? = nil, ec2Config: Ec2Config? = nil, fileSystemAccessRoleArn: String? = nil, inTransitEncryption: EfsInTransitEncryption? = nil, locationArn: String? = nil, locationUri: String? = nil) {
            self.accessPointArn = accessPointArn
            self.creationTime = creationTime
            self.ec2Config = ec2Config
            self.fileSystemAccessRoleArn = fileSystemAccessRoleArn
            self.inTransitEncryption = inTransitEncryption
            self.locationArn = locationArn
            self.locationUri = locationUri
        }

        private enum CodingKeys: String, CodingKey {
            case accessPointArn = "AccessPointArn"
            case creationTime = "CreationTime"
            case ec2Config = "Ec2Config"
            case fileSystemAccessRoleArn = "FileSystemAccessRoleArn"
            case inTransitEncryption = "InTransitEncryption"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
        }
    }

    public struct DescribeLocationFsxLustreRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the FSx for Lustre location to describe.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationFsxLustreResponse: AWSDecodableShape {
        /// The time that the FSx for Lustre location was created.
        public let creationTime: Date?
        /// The Amazon Resource Name (ARN) of the FSx for Lustre location that was described.
        public let locationArn: String?
        /// The URI of the FSx for Lustre location that was described.
        public let locationUri: String?
        /// The Amazon Resource Names (ARNs) of the security groups that are configured for the FSx for Lustre file system.
        public let securityGroupArns: [String]?

        @inlinable
        public init(creationTime: Date? = nil, locationArn: String? = nil, locationUri: String? = nil, securityGroupArns: [String]? = nil) {
            self.creationTime = creationTime
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.securityGroupArns = securityGroupArns
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime = "CreationTime"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case securityGroupArns = "SecurityGroupArns"
        }
    }

    public struct DescribeLocationFsxOntapRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the FSx for ONTAP file system location that you want information about.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationFsxOntapResponse: AWSDecodableShape {
        /// The time that the location was created.
        public let creationTime: Date?
        /// The ARN of the FSx for ONTAP file system.
        public let fsxFilesystemArn: String?
        /// The ARN of the FSx for ONTAP file system location.
        public let locationArn: String?
        /// The uniform resource identifier (URI) of the FSx for ONTAP file system location.
        public let locationUri: String?
        public let `protocol`: FsxProtocol?
        /// The security groups that DataSync uses to access your FSx for ONTAP file system.
        public let securityGroupArns: [String]?
        /// The ARN of the storage virtual machine (SVM) on your FSx for ONTAP file system where you're copying data to or from.
        public let storageVirtualMachineArn: String?

        @inlinable
        public init(creationTime: Date? = nil, fsxFilesystemArn: String? = nil, locationArn: String? = nil, locationUri: String? = nil, protocol: FsxProtocol? = nil, securityGroupArns: [String]? = nil, storageVirtualMachineArn: String? = nil) {
            self.creationTime = creationTime
            self.fsxFilesystemArn = fsxFilesystemArn
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.`protocol` = `protocol`
            self.securityGroupArns = securityGroupArns
            self.storageVirtualMachineArn = storageVirtualMachineArn
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime = "CreationTime"
            case fsxFilesystemArn = "FsxFilesystemArn"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case `protocol` = "Protocol"
            case securityGroupArns = "SecurityGroupArns"
            case storageVirtualMachineArn = "StorageVirtualMachineArn"
        }
    }

    public struct DescribeLocationFsxOpenZfsRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the FSx for OpenZFS location to describe.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationFsxOpenZfsResponse: AWSDecodableShape {
        /// The time that the FSx for OpenZFS location was created.
        public let creationTime: Date?
        /// The ARN of the FSx for OpenZFS location that was described.
        public let locationArn: String?
        /// The uniform resource identifier (URI) of the FSx for OpenZFS location that was described. Example: fsxz://us-west-2.fs-1234567890abcdef02/fsx/folderA/folder
        public let locationUri: String?
        /// The type of protocol that DataSync uses to access your file system.
        public let `protocol`: FsxProtocol?
        /// The ARNs of the security groups that are configured for the FSx for OpenZFS file system.
        public let securityGroupArns: [String]?

        @inlinable
        public init(creationTime: Date? = nil, locationArn: String? = nil, locationUri: String? = nil, protocol: FsxProtocol? = nil, securityGroupArns: [String]? = nil) {
            self.creationTime = creationTime
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.`protocol` = `protocol`
            self.securityGroupArns = securityGroupArns
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime = "CreationTime"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case `protocol` = "Protocol"
            case securityGroupArns = "SecurityGroupArns"
        }
    }

    public struct DescribeLocationFsxWindowsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the FSx for Windows File Server location.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationFsxWindowsResponse: AWSDecodableShape {
        /// The time that the FSx for Windows File Server location was created.
        public let creationTime: Date?
        /// The name of the Microsoft Active Directory domain that the FSx for Windows File Server file system belongs to.
        public let domain: String?
        /// The ARN of the FSx for Windows File Server location.
        public let locationArn: String?
        /// The uniform resource identifier (URI) of the FSx for Windows File Server location.
        public let locationUri: String?
        /// The ARNs of the Amazon EC2 security groups that provide access to your file system's preferred subnet. For information about configuring security groups for file system access, see the  Amazon FSx for Windows File Server User Guide .
        public let securityGroupArns: [String]?
        /// The user with the permissions to mount and access the FSx for Windows File Server file system.
        public let user: String?

        @inlinable
        public init(creationTime: Date? = nil, domain: String? = nil, locationArn: String? = nil, locationUri: String? = nil, securityGroupArns: [String]? = nil, user: String? = nil) {
            self.creationTime = creationTime
            self.domain = domain
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.securityGroupArns = securityGroupArns
            self.user = user
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime = "CreationTime"
            case domain = "Domain"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case securityGroupArns = "SecurityGroupArns"
            case user = "User"
        }
    }

    public struct DescribeLocationHdfsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the HDFS location.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationHdfsResponse: AWSDecodableShape {
        /// The ARNs of the DataSync agents that can connect with your HDFS cluster.
        public let agentArns: [String]?
        /// The type of authentication used to determine the identity of the user.
        public let authenticationType: HdfsAuthenticationType?
        /// The size of the data blocks to write into the HDFS cluster.
        public let blockSize: Int?
        /// The time that the HDFS location was created.
        public let creationTime: Date?
        /// The Kerberos principal with access to the files and folders on the HDFS cluster. This parameter is used if the AuthenticationType is defined as KERBEROS.
        public let kerberosPrincipal: String?
        ///  The URI of the HDFS cluster's Key Management Server (KMS).
        public let kmsKeyProviderUri: String?
        /// The ARN of the HDFS location.
        public let locationArn: String?
        /// The URI of the HDFS location.
        public let locationUri: String?
        /// The NameNode that manages the HDFS namespace.
        public let nameNodes: [HdfsNameNode]?
        /// The Quality of Protection (QOP) configuration, which specifies the Remote Procedure Call (RPC) and data transfer protection settings configured on the HDFS cluster.
        public let qopConfiguration: QopConfiguration?
        /// The number of DataNodes to replicate the data to when writing to the HDFS cluster.
        public let replicationFactor: Int?
        /// The user name to identify the client on the host operating system. This parameter is used if the AuthenticationType is defined as SIMPLE.
        public let simpleUser: String?

        @inlinable
        public init(agentArns: [String]? = nil, authenticationType: HdfsAuthenticationType? = nil, blockSize: Int? = nil, creationTime: Date? = nil, kerberosPrincipal: String? = nil, kmsKeyProviderUri: String? = nil, locationArn: String? = nil, locationUri: String? = nil, nameNodes: [HdfsNameNode]? = nil, qopConfiguration: QopConfiguration? = nil, replicationFactor: Int? = nil, simpleUser: String? = nil) {
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.blockSize = blockSize
            self.creationTime = creationTime
            self.kerberosPrincipal = kerberosPrincipal
            self.kmsKeyProviderUri = kmsKeyProviderUri
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.nameNodes = nameNodes
            self.qopConfiguration = qopConfiguration
            self.replicationFactor = replicationFactor
            self.simpleUser = simpleUser
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case blockSize = "BlockSize"
            case creationTime = "CreationTime"
            case kerberosPrincipal = "KerberosPrincipal"
            case kmsKeyProviderUri = "KmsKeyProviderUri"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case nameNodes = "NameNodes"
            case qopConfiguration = "QopConfiguration"
            case replicationFactor = "ReplicationFactor"
            case simpleUser = "SimpleUser"
        }
    }

    public struct DescribeLocationNfsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the NFS location that you want information about.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationNfsResponse: AWSDecodableShape {
        /// The time when the NFS location was created.
        public let creationTime: Date?
        /// The ARN of the NFS location.
        public let locationArn: String?
        /// The URI of the NFS location.
        public let locationUri: String?
        /// The mount options that DataSync uses to mount your NFS file server.
        public let mountOptions: NfsMountOptions?
        public let onPremConfig: OnPremConfig?

        @inlinable
        public init(creationTime: Date? = nil, locationArn: String? = nil, locationUri: String? = nil, mountOptions: NfsMountOptions? = nil, onPremConfig: OnPremConfig? = nil) {
            self.creationTime = creationTime
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.mountOptions = mountOptions
            self.onPremConfig = onPremConfig
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime = "CreationTime"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case mountOptions = "MountOptions"
            case onPremConfig = "OnPremConfig"
        }
    }

    public struct DescribeLocationObjectStorageRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the object storage system location.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationObjectStorageResponse: AWSDecodableShape {
        /// The access key (for example, a user name) required to authenticate with the object storage system.
        public let accessKey: String?
        /// The ARNs of the DataSync agents that can connect with your object storage system.
        public let agentArns: [String]?
        /// Describes configuration information for a DataSync-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
        public let cmkSecretConfig: CmkSecretConfig?
        /// The time that the location was created.
        public let creationTime: Date?
        /// Describes configuration information for a customer-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
        public let customSecretConfig: CustomSecretConfig?
        /// The ARN of the object storage system location.
        public let locationArn: String?
        /// The URI of the object storage system location.
        public let locationUri: String?
        /// Describes configuration information for a DataSync-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location. DataSync uses the default Amazon Web Services-managed KMS key to encrypt this secret in Secrets Manager.
        public let managedSecretConfig: ManagedSecretConfig?
        /// The certificate chain for DataSync to authenticate with your object storage system if the system uses a private or self-signed certificate authority (CA).
        public let serverCertificate: AWSBase64Data?
        /// The port that your object storage server accepts inbound network traffic on (for example, port 443).
        public let serverPort: Int?
        /// The protocol that your object storage system uses to communicate.
        public let serverProtocol: ObjectStorageServerProtocol?

        @inlinable
        public init(accessKey: String? = nil, agentArns: [String]? = nil, cmkSecretConfig: CmkSecretConfig? = nil, creationTime: Date? = nil, customSecretConfig: CustomSecretConfig? = nil, locationArn: String? = nil, locationUri: String? = nil, managedSecretConfig: ManagedSecretConfig? = nil, serverCertificate: AWSBase64Data? = nil, serverPort: Int? = nil, serverProtocol: ObjectStorageServerProtocol? = nil) {
            self.accessKey = accessKey
            self.agentArns = agentArns
            self.cmkSecretConfig = cmkSecretConfig
            self.creationTime = creationTime
            self.customSecretConfig = customSecretConfig
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.managedSecretConfig = managedSecretConfig
            self.serverCertificate = serverCertificate
            self.serverPort = serverPort
            self.serverProtocol = serverProtocol
        }

        private enum CodingKeys: String, CodingKey {
            case accessKey = "AccessKey"
            case agentArns = "AgentArns"
            case cmkSecretConfig = "CmkSecretConfig"
            case creationTime = "CreationTime"
            case customSecretConfig = "CustomSecretConfig"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case managedSecretConfig = "ManagedSecretConfig"
            case serverCertificate = "ServerCertificate"
            case serverPort = "ServerPort"
            case serverProtocol = "ServerProtocol"
        }
    }

    public struct DescribeLocationS3Request: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the Amazon S3 location.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationS3Response: AWSDecodableShape {
        /// The ARNs of the DataSync agents deployed on your Outpost when using working with Amazon S3 on Outposts. For more information, see Deploy your DataSync agent on Outposts.
        public let agentArns: [String]?
        /// The time that the Amazon S3 location was created.
        public let creationTime: Date?
        /// The ARN of the Amazon S3 location.
        public let locationArn: String?
        /// The URL of the Amazon S3 location that was described.
        public let locationUri: String?
        public let s3Config: S3Config?
        /// When Amazon S3 is a destination location, this is the storage class that you chose for your objects. Some storage classes have behaviors that can affect your Amazon S3 storage costs. For more information, see Storage class considerations with Amazon S3 transfers.
        public let s3StorageClass: S3StorageClass?

        @inlinable
        public init(agentArns: [String]? = nil, creationTime: Date? = nil, locationArn: String? = nil, locationUri: String? = nil, s3Config: S3Config? = nil, s3StorageClass: S3StorageClass? = nil) {
            self.agentArns = agentArns
            self.creationTime = creationTime
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.s3Config = s3Config
            self.s3StorageClass = s3StorageClass
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case creationTime = "CreationTime"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case s3Config = "S3Config"
            case s3StorageClass = "S3StorageClass"
        }
    }

    public struct DescribeLocationSmbRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the SMB location that you want information about.
        public let locationArn: String

        @inlinable
        public init(locationArn: String) {
            self.locationArn = locationArn
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
        }
    }

    public struct DescribeLocationSmbResponse: AWSDecodableShape {
        /// The ARNs of the DataSync agents that can connect with your SMB file server.
        public let agentArns: [String]?
        /// The authentication protocol that DataSync uses to connect to your SMB file server.
        public let authenticationType: SmbAuthenticationType?
        /// The time that the SMB location was created.
        public let creationTime: Date?
        /// The IPv4 or IPv6 addresses for the DNS servers that your SMB file server belongs to. This element applies only if AuthenticationType is set to KERBEROS.
        public let dnsIpAddresses: [String]?
        /// The name of the Windows domain that the SMB file server belongs to. This element applies only if AuthenticationType is set to NTLM.
        public let domain: String?
        /// The Kerberos principal that has permission to access the files, folders, and file metadata in your SMB file server.
        public let kerberosPrincipal: String?
        /// The ARN of the SMB location.
        public let locationArn: String?
        /// The URI of the SMB location.
        public let locationUri: String?
        /// The SMB protocol version that DataSync uses to access your SMB file server.
        public let mountOptions: SmbMountOptions?
        /// The user that can mount and access the files, folders, and file metadata in your SMB file server. This element applies only if AuthenticationType is set to NTLM.
        public let user: String?

        @inlinable
        public init(agentArns: [String]? = nil, authenticationType: SmbAuthenticationType? = nil, creationTime: Date? = nil, dnsIpAddresses: [String]? = nil, domain: String? = nil, kerberosPrincipal: String? = nil, locationArn: String? = nil, locationUri: String? = nil, mountOptions: SmbMountOptions? = nil, user: String? = nil) {
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.creationTime = creationTime
            self.dnsIpAddresses = dnsIpAddresses
            self.domain = domain
            self.kerberosPrincipal = kerberosPrincipal
            self.locationArn = locationArn
            self.locationUri = locationUri
            self.mountOptions = mountOptions
            self.user = user
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case creationTime = "CreationTime"
            case dnsIpAddresses = "DnsIpAddresses"
            case domain = "Domain"
            case kerberosPrincipal = "KerberosPrincipal"
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
            case mountOptions = "MountOptions"
            case user = "User"
        }
    }

    public struct DescribeTaskExecutionRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the task execution that you want information about.
        public let taskExecutionArn: String

        @inlinable
        public init(taskExecutionArn: String) {
            self.taskExecutionArn = taskExecutionArn
        }

        public func validate(name: String) throws {
            try self.validate(self.taskExecutionArn, name: "taskExecutionArn", parent: name, max: 128)
            try self.validate(self.taskExecutionArn, name: "taskExecutionArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}/execution/exec-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case taskExecutionArn = "TaskExecutionArn"
        }
    }

    public struct DescribeTaskExecutionResponse: AWSDecodableShape {
        /// The number of physical bytes that DataSync transfers over the network after compression (if compression is possible). This number is typically less than BytesTransferred unless the data isn't compressible.
        public let bytesCompressed: Int64?
        /// The number of bytes that DataSync sends to the network before compression (if compression is possible). For the number of bytes transferred over the network, see BytesCompressed.
        public let bytesTransferred: Int64?
        /// The number of logical bytes that DataSync actually writes to the destination location.
        public let bytesWritten: Int64?
        /// The time that the transfer task ends.
        public let endTime: Date?
        /// The number of logical bytes that DataSync expects to write to the destination location.
        public let estimatedBytesToTransfer: Int64?
        /// The number of files, objects, and directories that DataSync expects to delete in your destination location. If you don't configure your task to delete data in the destination that isn't in the source, the value is always 0.
        public let estimatedFilesToDelete: Int64?
        /// The number of files, objects, and directories that DataSync expects to transfer over the network. This value is calculated while DataSync prepares the transfer. How this gets calculated depends primarily on your task’s transfer mode configuration:   If TranserMode is set to CHANGED - The calculation is based on comparing the content of the source and destination locations and determining the difference that needs to be transferred. The difference can include:   Anything that's added or modified at the source location.   Anything that's in both locations and modified at the destination after an initial transfer (unless OverwriteMode is set to NEVER).    (Basic task mode only) The number of items that DataSync expects to delete (if PreserveDeletedFiles is set to REMOVE).     If TranserMode is set to ALL - The calculation is based only on the items that DataSync finds at the source location.
        public let estimatedFilesToTransfer: Int64?
        /// A list of filter rules that exclude specific data during your transfer. For more information and examples, see Filtering data transferred by DataSync.
        public let excludes: [FilterRule]?
        /// The number of files, objects, and directories that DataSync actually deletes in your destination location. If you don't configure your task to delete data in the destination that isn't in the source, the value is always 0.
        public let filesDeleted: Int64?
        /// The number of objects that DataSync fails to prepare, transfer, verify, and delete during your task execution.  Applies only to Enhanced mode tasks.
        public let filesFailed: TaskExecutionFilesFailedDetail?
        /// The number of objects that DataSync finds at your locations.  Applies only to Enhanced mode tasks.
        public let filesListed: TaskExecutionFilesListedDetail?
        /// The number of objects that DataSync will attempt to transfer after comparing your source and destination locations.  Applies only to Enhanced mode tasks.  This counter isn't applicable if you configure your task to transfer all data. In that scenario, DataSync copies everything from the source to the destination without comparing differences between the locations.
        public let filesPrepared: Int64?
        /// The number of files, objects, and directories that DataSync skips during your transfer.
        public let filesSkipped: Int64?
        /// The number of files, objects, and directories that DataSync actually transfers over the network. This value is updated periodically during your task execution when something is read from the source and sent over the network. If DataSync fails to transfer something, this value can be less than EstimatedFilesToTransfer. In some cases, this value can also be greater than EstimatedFilesToTransfer. This element is implementation-specific for some location types, so don't use it as an exact indication of what's transferring or to monitor your task execution.
        public let filesTransferred: Int64?
        /// The number of files, objects, and directories that DataSync verifies during your transfer.  When you configure your task to verify only the data that's transferred, DataSync doesn't verify directories in some situations or files that fail to transfer.
        public let filesVerified: Int64?
        /// A list of filter rules that include specific data during your transfer. For more information and examples, see Filtering data transferred by DataSync.
        public let includes: [FilterRule]?
        /// The time that the task execution actually begins. For non-queued tasks, LaunchTime and StartTime are typically the same. For queued tasks, LaunchTime is typically later than StartTime because previously queued tasks must finish running before newer tasks can begin.
        public let launchTime: Date?
        /// The configuration of the manifest that lists the files or objects to transfer. For more information, see Specifying what DataSync transfers by using a manifest.
        public let manifestConfig: ManifestConfig?
        public let options: Options?
        /// Indicates whether DataSync generated a complete task report for your transfer.
        public let reportResult: ReportResult?
        /// The result of the task execution.
        public let result: TaskExecutionResultDetail?
        /// The time that DataSync sends the request to start the task execution. For non-queued tasks, LaunchTime and StartTime are typically the same. For queued tasks, LaunchTime is typically later than StartTime because previously queued tasks must finish running before newer tasks can begin.
        public let startTime: Date?
        /// The status of the task execution.
        public let status: TaskExecutionStatus?
        /// The ARN of the task execution that you wanted information about. TaskExecutionArn is hierarchical and includes TaskArn for the task that was executed.  For example, a TaskExecution value with the ARN arn:aws:datasync:us-east-1:111222333444:task/task-0208075f79cedf4a2/execution/exec-08ef1e88ec491019b executed the task with the ARN arn:aws:datasync:us-east-1:111222333444:task/task-0208075f79cedf4a2.
        public let taskExecutionArn: String?
        /// The task mode that you're using. For more information, see Choosing a task mode for your data transfer.
        public let taskMode: TaskMode?
        /// The configuration of your task report, which provides detailed information about for your DataSync transfer. For more information, see Creating a task report.
        public let taskReportConfig: TaskReportConfig?

        @inlinable
        public init(bytesCompressed: Int64? = nil, bytesTransferred: Int64? = nil, bytesWritten: Int64? = nil, endTime: Date? = nil, estimatedBytesToTransfer: Int64? = nil, estimatedFilesToDelete: Int64? = nil, estimatedFilesToTransfer: Int64? = nil, excludes: [FilterRule]? = nil, filesDeleted: Int64? = nil, filesFailed: TaskExecutionFilesFailedDetail? = nil, filesListed: TaskExecutionFilesListedDetail? = nil, filesPrepared: Int64? = nil, filesSkipped: Int64? = nil, filesTransferred: Int64? = nil, filesVerified: Int64? = nil, includes: [FilterRule]? = nil, launchTime: Date? = nil, manifestConfig: ManifestConfig? = nil, options: Options? = nil, reportResult: ReportResult? = nil, result: TaskExecutionResultDetail? = nil, startTime: Date? = nil, status: TaskExecutionStatus? = nil, taskExecutionArn: String? = nil, taskMode: TaskMode? = nil, taskReportConfig: TaskReportConfig? = nil) {
            self.bytesCompressed = bytesCompressed
            self.bytesTransferred = bytesTransferred
            self.bytesWritten = bytesWritten
            self.endTime = endTime
            self.estimatedBytesToTransfer = estimatedBytesToTransfer
            self.estimatedFilesToDelete = estimatedFilesToDelete
            self.estimatedFilesToTransfer = estimatedFilesToTransfer
            self.excludes = excludes
            self.filesDeleted = filesDeleted
            self.filesFailed = filesFailed
            self.filesListed = filesListed
            self.filesPrepared = filesPrepared
            self.filesSkipped = filesSkipped
            self.filesTransferred = filesTransferred
            self.filesVerified = filesVerified
            self.includes = includes
            self.launchTime = launchTime
            self.manifestConfig = manifestConfig
            self.options = options
            self.reportResult = reportResult
            self.result = result
            self.startTime = startTime
            self.status = status
            self.taskExecutionArn = taskExecutionArn
            self.taskMode = taskMode
            self.taskReportConfig = taskReportConfig
        }

        private enum CodingKeys: String, CodingKey {
            case bytesCompressed = "BytesCompressed"
            case bytesTransferred = "BytesTransferred"
            case bytesWritten = "BytesWritten"
            case endTime = "EndTime"
            case estimatedBytesToTransfer = "EstimatedBytesToTransfer"
            case estimatedFilesToDelete = "EstimatedFilesToDelete"
            case estimatedFilesToTransfer = "EstimatedFilesToTransfer"
            case excludes = "Excludes"
            case filesDeleted = "FilesDeleted"
            case filesFailed = "FilesFailed"
            case filesListed = "FilesListed"
            case filesPrepared = "FilesPrepared"
            case filesSkipped = "FilesSkipped"
            case filesTransferred = "FilesTransferred"
            case filesVerified = "FilesVerified"
            case includes = "Includes"
            case launchTime = "LaunchTime"
            case manifestConfig = "ManifestConfig"
            case options = "Options"
            case reportResult = "ReportResult"
            case result = "Result"
            case startTime = "StartTime"
            case status = "Status"
            case taskExecutionArn = "TaskExecutionArn"
            case taskMode = "TaskMode"
            case taskReportConfig = "TaskReportConfig"
        }
    }

    public struct DescribeTaskRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the transfer task that you want information about.
        public let taskArn: String

        @inlinable
        public init(taskArn: String) {
            self.taskArn = taskArn
        }

        public func validate(name: String) throws {
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 128)
            try self.validate(self.taskArn, name: "taskArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case taskArn = "TaskArn"
        }
    }

    public struct DescribeTaskResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of an Amazon CloudWatch log group for monitoring your task. For more information, see Monitoring data transfers with CloudWatch Logs.
        public let cloudWatchLogGroupArn: String?
        /// The time that the task was created.
        public let creationTime: Date?
        /// The ARN of the most recent task execution.
        public let currentTaskExecutionArn: String?
        /// The ARN of your transfer's destination location.
        public let destinationLocationArn: String?
        /// The ARNs of the network interfaces that DataSync created for your destination location.
        public let destinationNetworkInterfaceArns: [String]?
        /// If there's an issue with your task, you can use the error code to help you troubleshoot the problem. For more information, see Troubleshooting issues with DataSync transfers.
        public let errorCode: String?
        /// If there's an issue with your task, you can use the error details to help you troubleshoot the problem. For more information, see Troubleshooting issues with DataSync transfers.
        public let errorDetail: String?
        /// The exclude filters that define the files, objects, and folders in your source location that you don't want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
        public let excludes: [FilterRule]?
        /// The include filters that define the files, objects, and folders in your source location that you want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
        public let includes: [FilterRule]?
        /// The configuration of the manifest that lists the files or objects that you want DataSync to transfer. For more information, see Specifying what DataSync transfers by using a manifest.
        public let manifestConfig: ManifestConfig?
        /// The name of your task.
        public let name: String?
        /// The task's settings. For example, what file metadata gets preserved, how data integrity gets verified at the end of your transfer, bandwidth limits, among other options.
        public let options: Options?
        /// The schedule for when you want your task to run. For more information, see Scheduling your task.
        public let schedule: TaskSchedule?
        /// The details about your task schedule.
        public let scheduleDetails: TaskScheduleDetails?
        /// The ARN of your transfer's source location.
        public let sourceLocationArn: String?
        /// The ARNs of the network interfaces that DataSync created for your source location.
        public let sourceNetworkInterfaceArns: [String]?
        /// The status of your task. For information about what each status means, see Task statuses.
        public let status: TaskStatus?
        /// The ARN of your task.
        public let taskArn: String?
        /// The task mode that you're using. For more information, see Choosing a task mode for your data transfer.
        public let taskMode: TaskMode?
        /// The configuration of your task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports.
        public let taskReportConfig: TaskReportConfig?

        @inlinable
        public init(cloudWatchLogGroupArn: String? = nil, creationTime: Date? = nil, currentTaskExecutionArn: String? = nil, destinationLocationArn: String? = nil, destinationNetworkInterfaceArns: [String]? = nil, errorCode: String? = nil, errorDetail: String? = nil, excludes: [FilterRule]? = nil, includes: [FilterRule]? = nil, manifestConfig: ManifestConfig? = nil, name: String? = nil, options: Options? = nil, schedule: TaskSchedule? = nil, scheduleDetails: TaskScheduleDetails? = nil, sourceLocationArn: String? = nil, sourceNetworkInterfaceArns: [String]? = nil, status: TaskStatus? = nil, taskArn: String? = nil, taskMode: TaskMode? = nil, taskReportConfig: TaskReportConfig? = nil) {
            self.cloudWatchLogGroupArn = cloudWatchLogGroupArn
            self.creationTime = creationTime
            self.currentTaskExecutionArn = currentTaskExecutionArn
            self.destinationLocationArn = destinationLocationArn
            self.destinationNetworkInterfaceArns = destinationNetworkInterfaceArns
            self.errorCode = errorCode
            self.errorDetail = errorDetail
            self.excludes = excludes
            self.includes = includes
            self.manifestConfig = manifestConfig
            self.name = name
            self.options = options
            self.schedule = schedule
            self.scheduleDetails = scheduleDetails
            self.sourceLocationArn = sourceLocationArn
            self.sourceNetworkInterfaceArns = sourceNetworkInterfaceArns
            self.status = status
            self.taskArn = taskArn
            self.taskMode = taskMode
            self.taskReportConfig = taskReportConfig
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogGroupArn = "CloudWatchLogGroupArn"
            case creationTime = "CreationTime"
            case currentTaskExecutionArn = "CurrentTaskExecutionArn"
            case destinationLocationArn = "DestinationLocationArn"
            case destinationNetworkInterfaceArns = "DestinationNetworkInterfaceArns"
            case errorCode = "ErrorCode"
            case errorDetail = "ErrorDetail"
            case excludes = "Excludes"
            case includes = "Includes"
            case manifestConfig = "ManifestConfig"
            case name = "Name"
            case options = "Options"
            case schedule = "Schedule"
            case scheduleDetails = "ScheduleDetails"
            case sourceLocationArn = "SourceLocationArn"
            case sourceNetworkInterfaceArns = "SourceNetworkInterfaceArns"
            case status = "Status"
            case taskArn = "TaskArn"
            case taskMode = "TaskMode"
            case taskReportConfig = "TaskReportConfig"
        }
    }

    public struct Ec2Config: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Amazon Resource Names (ARNs) of the security groups associated with an Amazon EFS file system's mount target.
        public let securityGroupArns: [String]
        /// Specifies the ARN of a subnet where DataSync creates the network interfaces for managing traffic during your transfer. The subnet must be located:   In the same virtual private cloud (VPC) as the Amazon EFS file system.   In the same Availability Zone as at least one mount target for the Amazon EFS file system.    You don't need to specify a subnet that includes a file system mount target.
        public let subnetArn: String

        @inlinable
        public init(securityGroupArns: [String], subnetArn: String) {
            self.securityGroupArns = securityGroupArns
            self.subnetArn = subnetArn
        }

        public func validate(name: String) throws {
            try self.securityGroupArns.forEach {
                try validate($0, name: "securityGroupArns[]", parent: name, max: 128)
                try validate($0, name: "securityGroupArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:security-group/sg-[a-f0-9]+$")
            }
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, max: 5)
            try self.validate(self.securityGroupArns, name: "securityGroupArns", parent: name, min: 1)
            try self.validate(self.subnetArn, name: "subnetArn", parent: name, max: 128)
            try self.validate(self.subnetArn, name: "subnetArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\-0-9]*:[0-9]{12}:subnet/.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case securityGroupArns = "SecurityGroupArns"
            case subnetArn = "SubnetArn"
        }
    }

    public struct FilterRule: AWSEncodableShape & AWSDecodableShape {
        /// The type of filter rule to apply. DataSync only supports the SIMPLE_PATTERN rule type.
        public let filterType: FilterType?
        /// A single filter string that consists of the patterns to include or exclude. The patterns are delimited by "|" (that is, a pipe), for example: /folder1|/folder2
        public let value: String?

        @inlinable
        public init(filterType: FilterType? = nil, value: String? = nil) {
            self.filterType = filterType
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.value, name: "value", parent: name, max: 102400)
            try self.validate(self.value, name: "value", parent: name, pattern: "^[^\\x00]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case filterType = "FilterType"
            case value = "Value"
        }
    }

    public struct FsxProtocol: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Network File System (NFS) protocol configuration that DataSync uses to access your FSx for OpenZFS file system or FSx for ONTAP file system's storage virtual machine (SVM).
        public let nfs: FsxProtocolNfs?
        /// Specifies the Server Message Block (SMB) protocol configuration that DataSync uses to access your FSx for ONTAP file system's SVM.
        public let smb: FsxProtocolSmb?

        @inlinable
        public init(nfs: FsxProtocolNfs? = nil, smb: FsxProtocolSmb? = nil) {
            self.nfs = nfs
            self.smb = smb
        }

        public func validate(name: String) throws {
            try self.smb?.validate(name: "\(name).smb")
        }

        private enum CodingKeys: String, CodingKey {
            case nfs = "NFS"
            case smb = "SMB"
        }
    }

    public struct FsxProtocolNfs: AWSEncodableShape & AWSDecodableShape {
        public let mountOptions: NfsMountOptions?

        @inlinable
        public init(mountOptions: NfsMountOptions? = nil) {
            self.mountOptions = mountOptions
        }

        private enum CodingKeys: String, CodingKey {
            case mountOptions = "MountOptions"
        }
    }

    public struct FsxProtocolSmb: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the name of the Windows domain that your storage virtual machine (SVM) belongs to. If you have multiple domains in your environment, configuring this setting makes sure that DataSync connects to the right SVM. If you have multiple Active Directory domains in your environment, configuring this parameter makes sure that DataSync connects to the right SVM.
        public let domain: String?
        public let mountOptions: SmbMountOptions?
        /// Specifies the password of a user who has permission to access your SVM.
        public let password: String
        /// Specifies a user that can mount and access the files, folders, and metadata in your SVM. For information about choosing a user with the right level of access for your transfer, see Using the SMB protocol.
        public let user: String

        @inlinable
        public init(domain: String? = nil, mountOptions: SmbMountOptions? = nil, password: String, user: String) {
            self.domain = domain
            self.mountOptions = mountOptions
            self.password = password
            self.user = user
        }

        public func validate(name: String) throws {
            try self.validate(self.domain, name: "domain", parent: name, max: 253)
            try self.validate(self.domain, name: "domain", parent: name, pattern: "^[A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252}$")
            try self.validate(self.password, name: "password", parent: name, max: 104)
            try self.validate(self.password, name: "password", parent: name, pattern: "^.{0,104}$")
            try self.validate(self.user, name: "user", parent: name, max: 104)
            try self.validate(self.user, name: "user", parent: name, pattern: "^[^\\x22\\x5B\\x5D/\\\\:;|=,+*?\\x3C\\x3E]{1,104}$")
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case mountOptions = "MountOptions"
            case password = "Password"
            case user = "User"
        }
    }

    public struct FsxUpdateProtocol: AWSEncodableShape {
        public let nfs: FsxProtocolNfs?
        /// Specifies the Server Message Block (SMB) protocol configuration that DataSync uses to access your FSx for ONTAP file system's storage virtual machine (SVM).
        public let smb: FsxUpdateProtocolSmb?

        @inlinable
        public init(nfs: FsxProtocolNfs? = nil, smb: FsxUpdateProtocolSmb? = nil) {
            self.nfs = nfs
            self.smb = smb
        }

        public func validate(name: String) throws {
            try self.smb?.validate(name: "\(name).smb")
        }

        private enum CodingKeys: String, CodingKey {
            case nfs = "NFS"
            case smb = "SMB"
        }
    }

    public struct FsxUpdateProtocolSmb: AWSEncodableShape {
        /// Specifies the name of the Windows domain that your storage virtual machine (SVM) belongs to. If you have multiple Active Directory domains in your environment, configuring this parameter makes sure that DataSync connects to the right SVM.
        public let domain: String?
        public let mountOptions: SmbMountOptions?
        /// Specifies the password of a user who has permission to access your SVM.
        public let password: String?
        /// Specifies a user that can mount and access the files, folders, and metadata in your SVM. For information about choosing a user with the right level of access for your transfer, see Using the SMB protocol.
        public let user: String?

        @inlinable
        public init(domain: String? = nil, mountOptions: SmbMountOptions? = nil, password: String? = nil, user: String? = nil) {
            self.domain = domain
            self.mountOptions = mountOptions
            self.password = password
            self.user = user
        }

        public func validate(name: String) throws {
            try self.validate(self.domain, name: "domain", parent: name, max: 253)
            try self.validate(self.domain, name: "domain", parent: name, pattern: "^([A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252})?$")
            try self.validate(self.password, name: "password", parent: name, max: 104)
            try self.validate(self.password, name: "password", parent: name, pattern: "^.{0,104}$")
            try self.validate(self.user, name: "user", parent: name, max: 104)
            try self.validate(self.user, name: "user", parent: name, pattern: "^[^\\x22\\x5B\\x5D/\\\\:;|=,+*?\\x3C\\x3E]{1,104}$")
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case mountOptions = "MountOptions"
            case password = "Password"
            case user = "User"
        }
    }

    public struct HdfsNameNode: AWSEncodableShape & AWSDecodableShape {
        /// The hostname of the NameNode in the HDFS cluster. This value is the IP address or Domain Name Service (DNS) name of the NameNode. An agent that's installed on-premises uses this hostname to communicate with the NameNode in the network.
        public let hostname: String
        /// The port that the NameNode uses to listen to client requests.
        public let port: Int

        @inlinable
        public init(hostname: String, port: Int) {
            self.hostname = hostname
            self.port = port
        }

        public func validate(name: String) throws {
            try self.validate(self.hostname, name: "hostname", parent: name, max: 255)
            try self.validate(self.hostname, name: "hostname", parent: name, min: 1)
            try self.validate(self.hostname, name: "hostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-]*[A-Za-z0-9])$")
            try self.validate(self.port, name: "port", parent: name, max: 65536)
            try self.validate(self.port, name: "port", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case hostname = "Hostname"
            case port = "Port"
        }
    }

    public struct InternalException: AWSErrorShape {
        public let errorCode: String?
        public let message: String?

        @inlinable
        public init(errorCode: String? = nil, message: String? = nil) {
            self.errorCode = errorCode
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case errorCode = "errorCode"
            case message = "message"
        }
    }

    public struct InvalidRequestException: AWSErrorShape {
        public let datasyncErrorCode: String?
        public let errorCode: String?
        public let message: String?

        @inlinable
        public init(datasyncErrorCode: String? = nil, errorCode: String? = nil, message: String? = nil) {
            self.datasyncErrorCode = datasyncErrorCode
            self.errorCode = errorCode
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case datasyncErrorCode = "datasyncErrorCode"
            case errorCode = "errorCode"
            case message = "message"
        }
    }

    public struct ListAgentsRequest: AWSEncodableShape {
        /// Specifies the maximum number of DataSync agents to list in a response. By default, a response shows a maximum of 100 agents.
        public let maxResults: Int?
        /// Specifies an opaque string that indicates the position to begin the next list of results in the response.
        public let nextToken: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 65535)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[a-zA-Z0-9=_-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListAgentsResponse: AWSDecodableShape {
        /// A list of DataSync agents in your Amazon Web Services account in the Amazon Web Services Region specified in the request. The list is ordered by the agents' Amazon Resource Names (ARNs).
        public let agents: [AgentListEntry]?
        /// The opaque string that indicates the position to begin the next list of results in the response.
        public let nextToken: String?

        @inlinable
        public init(agents: [AgentListEntry]? = nil, nextToken: String? = nil) {
            self.agents = agents
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case agents = "Agents"
            case nextToken = "NextToken"
        }
    }

    public struct ListLocationsRequest: AWSEncodableShape {
        /// You can use API filters to narrow down the list of resources returned by ListLocations. For example, to retrieve all tasks on a specific source location, you can use ListLocations with filter name LocationType S3 and Operator Equals.
        public let filters: [LocationFilter]?
        /// The maximum number of locations to return.
        public let maxResults: Int?
        /// An opaque string that indicates the position at which to begin the next list of locations.
        public let nextToken: String?

        @inlinable
        public init(filters: [LocationFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 65535)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[a-zA-Z0-9=_-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListLocationsResponse: AWSDecodableShape {
        /// An array that contains a list of locations.
        public let locations: [LocationListEntry]?
        /// An opaque string that indicates the position at which to begin returning the next list of locations.
        public let nextToken: String?

        @inlinable
        public init(locations: [LocationListEntry]? = nil, nextToken: String? = nil) {
            self.locations = locations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case locations = "Locations"
            case nextToken = "NextToken"
        }
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        /// Specifies how many results that you want in the response.
        public let maxResults: Int?
        /// Specifies an opaque string that indicates the position to begin the next list of results in the response.
        public let nextToken: String?
        /// Specifies the Amazon Resource Name (ARN) of the resource that you want tag information on.
        public let resourceArn: String

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, resourceArn: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 65535)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[a-zA-Z0-9=_-]+$")
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 128)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:(agent|task|location|system)/((agent|task|loc)-[a-f0-9]{17}|storage-system-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})(/execution/exec-[a-f0-9]{17})?$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resourceArn = "ResourceArn"
        }
    }

    public struct ListTagsForResourceResponse: AWSDecodableShape {
        /// The opaque string that indicates the position to begin the next list of results in the response.
        public let nextToken: String?
        /// An array of tags applied to the specified resource.
        public let tags: [TagListEntry]?

        @inlinable
        public init(nextToken: String? = nil, tags: [TagListEntry]? = nil) {
            self.nextToken = nextToken
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case tags = "Tags"
        }
    }

    public struct ListTaskExecutionsRequest: AWSEncodableShape {
        /// Specifies how many results you want in the response.
        public let maxResults: Int?
        /// Specifies an opaque string that indicates the position at which to begin the next list of results in the response.
        public let nextToken: String?
        /// Specifies the Amazon Resource Name (ARN) of the task that you want execution information about.
        public let taskArn: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, taskArn: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.taskArn = taskArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 65535)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[a-zA-Z0-9=_-]+$")
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 128)
            try self.validate(self.taskArn, name: "taskArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case taskArn = "TaskArn"
        }
    }

    public struct ListTaskExecutionsResponse: AWSDecodableShape {
        /// The opaque string that indicates the position to begin the next list of results in the response.
        public let nextToken: String?
        /// A list of the task's executions.
        public let taskExecutions: [TaskExecutionListEntry]?

        @inlinable
        public init(nextToken: String? = nil, taskExecutions: [TaskExecutionListEntry]? = nil) {
            self.nextToken = nextToken
            self.taskExecutions = taskExecutions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case taskExecutions = "TaskExecutions"
        }
    }

    public struct ListTasksRequest: AWSEncodableShape {
        /// You can use API filters to narrow down the list of resources returned by ListTasks. For example, to retrieve all tasks on a specific source location, you can use ListTasks with filter name LocationId and Operator Equals with the ARN for the location.
        public let filters: [TaskFilter]?
        /// The maximum number of tasks to return.
        public let maxResults: Int?
        /// An opaque string that indicates the position at which to begin the next list of tasks.
        public let nextToken: String?

        @inlinable
        public init(filters: [TaskFilter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 65535)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[a-zA-Z0-9=_-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListTasksResponse: AWSDecodableShape {
        /// An opaque string that indicates the position at which to begin returning the next list of tasks.
        public let nextToken: String?
        /// A list of all the tasks that are returned.
        public let tasks: [TaskListEntry]?

        @inlinable
        public init(nextToken: String? = nil, tasks: [TaskListEntry]? = nil) {
            self.nextToken = nextToken
            self.tasks = tasks
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case tasks = "Tasks"
        }
    }

    public struct LocationFilter: AWSEncodableShape {
        /// The name of the filter being used. Each API call supports a list of filters that are available for it (for example, LocationType for ListLocations).
        public let name: LocationFilterName
        /// The operator that is used to compare filter values (for example, Equals or Contains).
        public let `operator`: Operator
        /// The values that you want to filter for. For example, you might want to display only Amazon S3 locations.
        public let values: [String]

        @inlinable
        public init(name: LocationFilterName, operator: Operator, values: [String]) {
            self.name = name
            self.`operator` = `operator`
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 255)
                try validate($0, name: "values[]", parent: name, min: 1)
                try validate($0, name: "values[]", parent: name, pattern: "^[0-9a-zA-Z_\\ \\-\\:\\*\\.\\\\/\\?-]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct LocationListEntry: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the location. For Network File System (NFS) or Amazon EFS,  the location is the export path. For Amazon S3, the location is the prefix path that you want to mount and use as the root of the location.
        public let locationArn: String?
        /// Represents a list of URIs of a location. LocationUri returns an array that contains a list of locations when the ListLocations operation is called. Format: TYPE://GLOBAL_ID/SUBDIR. TYPE designates the type of location (for example, nfs or s3). GLOBAL_ID is the globally unique identifier of the resource that backs the location. An example for EFS is us-east-2.fs-abcd1234. An example for Amazon S3 is the bucket name, such as myBucket. An example for NFS is a valid IPv4 or IPv6 address or a hostname that is compliant with DNS. SUBDIR is a valid file system path, delimited by forward slashes as is the *nix convention. For NFS and Amazon EFS, it's the export path to mount the location. For Amazon S3, it's the prefix path that you mount to and treat as the root of the location.
        public let locationUri: String?

        @inlinable
        public init(locationArn: String? = nil, locationUri: String? = nil) {
            self.locationArn = locationArn
            self.locationUri = locationUri
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
            case locationUri = "LocationUri"
        }
    }

    public struct ManagedSecretConfig: AWSDecodableShape {
        /// Specifies the ARN for an Secrets Manager secret.
        public let secretArn: String?

        @inlinable
        public init(secretArn: String? = nil) {
            self.secretArn = secretArn
        }

        private enum CodingKeys: String, CodingKey {
            case secretArn = "SecretArn"
        }
    }

    public struct ManifestConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies what DataSync uses the manifest for.
        public let action: ManifestAction?
        /// Specifies the file format of your manifest. For more information, see Creating a manifest.
        public let format: ManifestFormat?
        /// Specifies the manifest that you want DataSync to use and where it's hosted.  You must specify this parameter if you're configuring a new manifest on or after February 7, 2024. If you don't, you'll get a 400 status code and ValidationException error stating that you're missing the IAM role for DataSync to access the S3 bucket where you're hosting your manifest. For more information, see Providing DataSync access to your manifest.
        public let source: SourceManifestConfig?

        @inlinable
        public init(action: ManifestAction? = nil, format: ManifestFormat? = nil, source: SourceManifestConfig? = nil) {
            self.action = action
            self.format = format
            self.source = source
        }

        public func validate(name: String) throws {
            try self.source?.validate(name: "\(name).source")
        }

        private enum CodingKeys: String, CodingKey {
            case action = "Action"
            case format = "Format"
            case source = "Source"
        }
    }

    public struct NfsMountOptions: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the NFS version that you want DataSync to use when mounting your NFS share. If the server refuses to use the version specified, the task fails. You can specify the following options:    AUTOMATIC (default): DataSync chooses NFS version 4.1.    NFS3: Stateless protocol version that allows for asynchronous writes on the server.    NFSv4_0: Stateful, firewall-friendly protocol version that supports delegations and pseudo file systems.    NFSv4_1: Stateful protocol version that supports sessions, directory delegations, and parallel data processing. NFS version 4.1 also includes all features available in version 4.0.    DataSync currently only supports NFS version 3 with Amazon FSx for NetApp ONTAP locations.
        public let version: NfsVersion?

        @inlinable
        public init(version: NfsVersion? = nil) {
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case version = "Version"
        }
    }

    public struct OnPremConfig: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Names (ARNs) of the DataSync agents that can connect to your NFS file server. You can specify more than one agent. For more information, see Using multiple DataSync agents.
        public let agentArns: [String]

        @inlinable
        public init(agentArns: [String]) {
            self.agentArns = agentArns
        }

        public func validate(name: String) throws {
            try self.agentArns.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
        }
    }

    public struct Options: AWSEncodableShape & AWSDecodableShape {
        /// Specifies whether to preserve metadata indicating the last time a file was read or written to.  The behavior of Atime isn't fully standard across platforms, so DataSync can only do this on a best-effort basis.     BEST_EFFORT (default) - DataSync attempts to preserve the original Atime attribute on all source files (that is, the version before the PREPARING steps of the task execution). This option is recommended.    NONE - Ignores Atime.    If Atime is set to BEST_EFFORT, Mtime must be set to PRESERVE.  If Atime is set to NONE, Mtime must also be NONE.
        public let atime: Atime?
        /// Limits the bandwidth used by a DataSync task. For example, if you want DataSync to use a maximum of 1 MB, set this value to 1048576 (=1024*1024).  Not applicable to Enhanced mode tasks.
        public let bytesPerSecond: Int64?
        /// Specifies the POSIX group ID (GID) of the file's owners.    INT_VALUE (default) - Preserves the integer value of user ID (UID) and GID, which is recommended.    NONE - Ignores UID and GID.   For more information, see Understanding how DataSync handles file and object metadata.
        public let gid: Gid?
        /// Specifies the type of logs that DataSync publishes to a Amazon CloudWatch Logs log group. To specify the log group, see CloudWatchLogGroupArn.    BASIC - Publishes logs with only basic information (such as transfer errors).    TRANSFER - Publishes logs for all files or objects that your DataSync task transfers and performs data-integrity checks on.    OFF - No logs are published.
        public let logLevel: LogLevel?
        /// Specifies whether to preserve metadata indicating the last time that a file was written to before the PREPARING step of your task execution. This option is required when you need to run the a task more than once.    PRESERVE (default) - Preserves original Mtime, which is recommended.    NONE - Ignores Mtime.    If Mtime is set to PRESERVE, Atime must be set to BEST_EFFORT. If Mtime is set to NONE, Atime must also be set to NONE.
        public let mtime: Mtime?
        /// Specifies whether you want DataSync to PRESERVE object tags (default behavior) when transferring between object storage systems. If you want your DataSync task to ignore object tags, specify the NONE value.
        public let objectTags: ObjectTags?
        /// Specifies whether DataSync should modify or preserve data at the destination location.    ALWAYS (default) - DataSync modifies data in the destination location when source data (including metadata) has changed. If DataSync overwrites objects, you might incur additional charges for certain Amazon S3 storage classes (for example, for retrieval or early deletion). For more information, see Storage class considerations with Amazon S3 transfers.    NEVER - DataSync doesn't overwrite data in the destination location even if the source data has changed. You can use this option to protect against overwriting changes made to files or objects in the destination.
        public let overwriteMode: OverwriteMode?
        /// Specifies which users or groups can access a file for a specific purpose such as reading, writing, or execution of the file. For more information, see Understanding how DataSync handles file and object metadata.    PRESERVE (default) - Preserves POSIX-style permissions, which is recommended.    NONE - Ignores POSIX-style permissions.     DataSync can preserve extant permissions of a source location.
        public let posixPermissions: PosixPermissions?
        /// Specifies whether files in the destination location that don't exist in the source should be preserved. This option can affect your Amazon S3 storage cost. If your task deletes objects, you might incur minimum storage duration charges for certain storage classes. For detailed information, see Considerations when working with Amazon S3 storage classes in DataSync.    PRESERVE (default) - Ignores such destination files, which is recommended.     REMOVE - Deletes destination files that aren’t present in the source.    If you set this parameter to REMOVE, you can't set TransferMode to ALL. When you transfer all data, DataSync doesn't scan your destination location and doesn't know what to delete.
        public let preserveDeletedFiles: PreserveDeletedFiles?
        /// Specifies whether DataSync should preserve the metadata of block and character devices in the source location and recreate the files with that device name and metadata on the destination. DataSync copies only the name and metadata of such devices.  DataSync can't copy the actual contents of these devices because they're nonterminal and don't return an end-of-file (EOF) marker.     NONE (default) - Ignores special devices (recommended).    PRESERVE - Preserves character and block device metadata. This option currently isn't supported for Amazon EFS.
        public let preserveDevices: PreserveDevices?
        /// Specifies which components of the SMB security descriptor are copied from source to destination objects.  This value is only used for transfers between SMB and Amazon FSx for Windows File Server locations or between two FSx for Windows File Server locations. For more information, see Understanding how DataSync handles file and object metadata.    OWNER_DACL (default) - For each copied object, DataSync copies the following metadata:   The object owner.   NTFS discretionary access control lists (DACLs), which determine whether to grant access to an object. DataSync won't copy NTFS system access control lists (SACLs) with this option.      OWNER_DACL_SACL - For each copied object, DataSync copies the following metadata:   The object owner.   NTFS discretionary access control lists (DACLs), which determine whether to grant access to an object.   SACLs, which are used by administrators to log attempts to access a secured object. Copying SACLs requires granting additional permissions to the Windows user that DataSync uses to access your SMB location. For information about choosing a user with the right permissions, see required permissions for SMB, FSx for Windows File Server, or FSx for ONTAP (depending on the type of location in your transfer).      NONE - None of the SMB security descriptor components are copied. Destination objects are owned by the user that was provided for accessing the destination location. DACLs and SACLs are set based on the destination server’s configuration.
        public let securityDescriptorCopyFlags: SmbSecurityDescriptorCopyFlags?
        /// Specifies whether your transfer tasks should be put into a queue during certain scenarios when running multiple tasks. This is ENABLED by default.
        public let taskQueueing: TaskQueueing?
        /// Specifies whether DataSync transfers only the data (including metadata) that differs between locations following an initial copy or transfers all data every time you run the task. If you're planning on recurring transfers, you might only want to transfer what's changed since your previous task execution.    CHANGED (default) - After your initial full transfer, DataSync copies only the data and metadata that differs between the source and destination location.    ALL - DataSync copies everything in the source to the destination without comparing differences between the locations.
        public let transferMode: TransferMode?
        /// Specifies the POSIX user ID (UID) of the file's owner.    INT_VALUE (default) - Preserves the integer value of UID and group ID (GID), which is recommended.    NONE - Ignores UID and GID.    For more information, see Metadata copied by DataSync.
        public let uid: Uid?
        /// Specifies if and how DataSync checks the integrity of your data at the end of your transfer.    ONLY_FILES_TRANSFERRED (recommended) - DataSync calculates the checksum of transferred data (including metadata) at the source location. At the end of the transfer, DataSync then compares this checksum to the checksum calculated on that data at the destination.  This is the default option for Enhanced mode tasks.  We recommend this option when transferring to S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive storage classes. For more information, see Storage class considerations with Amazon S3 locations.    POINT_IN_TIME_CONSISTENT - At the end of the transfer, DataSync checks the entire source and destination to verify that both locations are fully synchronized.  The is the default option for Basic mode tasks and isn't currently supported with Enhanced mode tasks.  If you use a manifest, DataSync only scans and verifies what's listed in the manifest. You can't use this option when transferring to S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive storage classes. For more information, see Storage class considerations with Amazon S3 locations.    NONE - DataSync performs data integrity checks only during your transfer. Unlike other options, there's no additional verification at the end of your transfer.
        public let verifyMode: VerifyMode?

        @inlinable
        public init(atime: Atime? = nil, bytesPerSecond: Int64? = nil, gid: Gid? = nil, logLevel: LogLevel? = nil, mtime: Mtime? = nil, objectTags: ObjectTags? = nil, overwriteMode: OverwriteMode? = nil, posixPermissions: PosixPermissions? = nil, preserveDeletedFiles: PreserveDeletedFiles? = nil, preserveDevices: PreserveDevices? = nil, securityDescriptorCopyFlags: SmbSecurityDescriptorCopyFlags? = nil, taskQueueing: TaskQueueing? = nil, transferMode: TransferMode? = nil, uid: Uid? = nil, verifyMode: VerifyMode? = nil) {
            self.atime = atime
            self.bytesPerSecond = bytesPerSecond
            self.gid = gid
            self.logLevel = logLevel
            self.mtime = mtime
            self.objectTags = objectTags
            self.overwriteMode = overwriteMode
            self.posixPermissions = posixPermissions
            self.preserveDeletedFiles = preserveDeletedFiles
            self.preserveDevices = preserveDevices
            self.securityDescriptorCopyFlags = securityDescriptorCopyFlags
            self.taskQueueing = taskQueueing
            self.transferMode = transferMode
            self.uid = uid
            self.verifyMode = verifyMode
        }

        public func validate(name: String) throws {
            try self.validate(self.bytesPerSecond, name: "bytesPerSecond", parent: name, min: -1)
        }

        private enum CodingKeys: String, CodingKey {
            case atime = "Atime"
            case bytesPerSecond = "BytesPerSecond"
            case gid = "Gid"
            case logLevel = "LogLevel"
            case mtime = "Mtime"
            case objectTags = "ObjectTags"
            case overwriteMode = "OverwriteMode"
            case posixPermissions = "PosixPermissions"
            case preserveDeletedFiles = "PreserveDeletedFiles"
            case preserveDevices = "PreserveDevices"
            case securityDescriptorCopyFlags = "SecurityDescriptorCopyFlags"
            case taskQueueing = "TaskQueueing"
            case transferMode = "TransferMode"
            case uid = "Uid"
            case verifyMode = "VerifyMode"
        }
    }

    public struct Platform: AWSDecodableShape {
        /// The version of the DataSync agent.
        public let version: String?

        @inlinable
        public init(version: String? = nil) {
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case version = "Version"
        }
    }

    public struct PrivateLinkConfig: AWSDecodableShape {
        /// Specifies the VPC endpoint provided by Amazon Web Services PrivateLink that your agent connects to.
        public let privateLinkEndpoint: String?
        /// Specifies the Amazon Resource Names (ARN) of the security group that provides DataSync access to your VPC endpoint. You can only specify one ARN.
        public let securityGroupArns: [String]?
        /// Specifies the ARN of the subnet where your VPC endpoint is located. You can only specify one ARN.
        public let subnetArns: [String]?
        /// Specifies the ID of the VPC endpoint that your agent connects to.
        public let vpcEndpointId: String?

        @inlinable
        public init(privateLinkEndpoint: String? = nil, securityGroupArns: [String]? = nil, subnetArns: [String]? = nil, vpcEndpointId: String? = nil) {
            self.privateLinkEndpoint = privateLinkEndpoint
            self.securityGroupArns = securityGroupArns
            self.subnetArns = subnetArns
            self.vpcEndpointId = vpcEndpointId
        }

        private enum CodingKeys: String, CodingKey {
            case privateLinkEndpoint = "PrivateLinkEndpoint"
            case securityGroupArns = "SecurityGroupArns"
            case subnetArns = "SubnetArns"
            case vpcEndpointId = "VpcEndpointId"
        }
    }

    public struct QopConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// The data transfer protection setting configured on the HDFS cluster. This setting corresponds to your dfs.data.transfer.protection setting in the hdfs-site.xml file on your Hadoop cluster.
        public let dataTransferProtection: HdfsDataTransferProtection?
        /// The RPC protection setting configured on the HDFS cluster. This setting corresponds to your hadoop.rpc.protection setting in your core-site.xml file on your Hadoop cluster.
        public let rpcProtection: HdfsRpcProtection?

        @inlinable
        public init(dataTransferProtection: HdfsDataTransferProtection? = nil, rpcProtection: HdfsRpcProtection? = nil) {
            self.dataTransferProtection = dataTransferProtection
            self.rpcProtection = rpcProtection
        }

        private enum CodingKeys: String, CodingKey {
            case dataTransferProtection = "DataTransferProtection"
            case rpcProtection = "RpcProtection"
        }
    }

    public struct ReportDestination: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Amazon S3 bucket where DataSync uploads your task report.
        public let s3: ReportDestinationS3?

        @inlinable
        public init(s3: ReportDestinationS3? = nil) {
            self.s3 = s3
        }

        public func validate(name: String) throws {
            try self.s3?.validate(name: "\(name).s3")
        }

        private enum CodingKeys: String, CodingKey {
            case s3 = "S3"
        }
    }

    public struct ReportDestinationS3: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the IAM policy that allows DataSync to upload a task report to your S3 bucket. For more information, see Allowing DataSync to upload a task report to an Amazon S3 bucket.
        public let bucketAccessRoleArn: String
        /// Specifies the ARN of the S3 bucket where DataSync uploads your report.
        public let s3BucketArn: String
        /// Specifies a bucket prefix for your report.
        public let subdirectory: String?

        @inlinable
        public init(bucketAccessRoleArn: String, s3BucketArn: String, subdirectory: String? = nil) {
            self.bucketAccessRoleArn = bucketAccessRoleArn
            self.s3BucketArn = s3BucketArn
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketAccessRoleArn, name: "bucketAccessRoleArn", parent: name, max: 2048)
            try self.validate(self.bucketAccessRoleArn, name: "bucketAccessRoleArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$")
            try self.validate(self.s3BucketArn, name: "s3BucketArn", parent: name, max: 268)
            try self.validate(self.s3BucketArn, name: "s3BucketArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3:[a-z\\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\\-.]{1,63}$|^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3-outposts:[a-z\\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\\-]{1,63}$|^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3:::[a-zA-Z0-9.\\-_]{1,255}$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketAccessRoleArn = "BucketAccessRoleArn"
            case s3BucketArn = "S3BucketArn"
            case subdirectory = "Subdirectory"
        }
    }

    public struct ReportOverride: AWSEncodableShape & AWSDecodableShape {
        /// Specifies whether your task report includes errors only or successes and errors. For example, your report might mostly include only what didn't go well in your transfer (ERRORS_ONLY). At the same time, you want to verify that your task filter is working correctly. In this situation, you can get a list of what files DataSync successfully skipped and if something transferred that you didn't to transfer (SUCCESSES_AND_ERRORS).
        public let reportLevel: ReportLevel?

        @inlinable
        public init(reportLevel: ReportLevel? = nil) {
            self.reportLevel = reportLevel
        }

        private enum CodingKeys: String, CodingKey {
            case reportLevel = "ReportLevel"
        }
    }

    public struct ReportOverrides: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the level of reporting for the files, objects, and directories that DataSync attempted to delete in your destination location. This only applies if you configure your task to delete data in the destination that isn't in the source.
        public let deleted: ReportOverride?
        /// Specifies the level of reporting for the files, objects, and directories that DataSync attempted to skip during your transfer.
        public let skipped: ReportOverride?
        /// Specifies the level of reporting for the files, objects, and directories that DataSync attempted to transfer.
        public let transferred: ReportOverride?
        /// Specifies the level of reporting for the files, objects, and directories that DataSync attempted to verify at the end of your transfer.
        public let verified: ReportOverride?

        @inlinable
        public init(deleted: ReportOverride? = nil, skipped: ReportOverride? = nil, transferred: ReportOverride? = nil, verified: ReportOverride? = nil) {
            self.deleted = deleted
            self.skipped = skipped
            self.transferred = transferred
            self.verified = verified
        }

        private enum CodingKeys: String, CodingKey {
            case deleted = "Deleted"
            case skipped = "Skipped"
            case transferred = "Transferred"
            case verified = "Verified"
        }
    }

    public struct ReportResult: AWSDecodableShape {
        /// Indicates the code associated with the error if DataSync can't create a complete report.
        public let errorCode: String?
        /// Provides details about issues creating a report.
        public let errorDetail: String?
        /// Indicates whether DataSync is still working on your report, created a report, or can't create a complete report.
        public let status: PhaseStatus?

        @inlinable
        public init(errorCode: String? = nil, errorDetail: String? = nil, status: PhaseStatus? = nil) {
            self.errorCode = errorCode
            self.errorDetail = errorDetail
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case errorCode = "ErrorCode"
            case errorDetail = "ErrorDetail"
            case status = "Status"
        }
    }

    public struct S3Config: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the ARN of the IAM role that DataSync uses to access your S3 bucket.
        public let bucketAccessRoleArn: String

        @inlinable
        public init(bucketAccessRoleArn: String) {
            self.bucketAccessRoleArn = bucketAccessRoleArn
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketAccessRoleArn, name: "bucketAccessRoleArn", parent: name, max: 2048)
            try self.validate(self.bucketAccessRoleArn, name: "bucketAccessRoleArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketAccessRoleArn = "BucketAccessRoleArn"
        }
    }

    public struct S3ManifestConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Identity and Access Management (IAM) role that allows DataSync to access your manifest. For more information, see Providing DataSync access to your manifest.
        public let bucketAccessRoleArn: String
        /// Specifies the Amazon S3 object key of your manifest. This can include a prefix (for example, prefix/my-manifest.csv).
        public let manifestObjectPath: String
        /// Specifies the object version ID of the manifest that you want DataSync to use. If you don't set this, DataSync uses the latest version of the object.
        public let manifestObjectVersionId: String?
        /// Specifies the Amazon Resource Name (ARN) of the S3 bucket where you're hosting your manifest.
        public let s3BucketArn: String

        @inlinable
        public init(bucketAccessRoleArn: String, manifestObjectPath: String, manifestObjectVersionId: String? = nil, s3BucketArn: String) {
            self.bucketAccessRoleArn = bucketAccessRoleArn
            self.manifestObjectPath = manifestObjectPath
            self.manifestObjectVersionId = manifestObjectVersionId
            self.s3BucketArn = s3BucketArn
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketAccessRoleArn, name: "bucketAccessRoleArn", parent: name, max: 2048)
            try self.validate(self.bucketAccessRoleArn, name: "bucketAccessRoleArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$")
            try self.validate(self.manifestObjectPath, name: "manifestObjectPath", parent: name, max: 4096)
            try self.validate(self.manifestObjectPath, name: "manifestObjectPath", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
            try self.validate(self.manifestObjectVersionId, name: "manifestObjectVersionId", parent: name, max: 100)
            try self.validate(self.manifestObjectVersionId, name: "manifestObjectVersionId", parent: name, min: 1)
            try self.validate(self.manifestObjectVersionId, name: "manifestObjectVersionId", parent: name, pattern: "^.+$")
            try self.validate(self.s3BucketArn, name: "s3BucketArn", parent: name, max: 268)
            try self.validate(self.s3BucketArn, name: "s3BucketArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3:[a-z\\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\\-.]{1,63}$|^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3-outposts:[a-z\\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\\-]{1,63}$|^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):s3:::[a-zA-Z0-9.\\-_]{1,255}$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketAccessRoleArn = "BucketAccessRoleArn"
            case manifestObjectPath = "ManifestObjectPath"
            case manifestObjectVersionId = "ManifestObjectVersionId"
            case s3BucketArn = "S3BucketArn"
        }
    }

    public struct SmbMountOptions: AWSEncodableShape & AWSDecodableShape {
        /// By default, DataSync automatically chooses an SMB protocol version based on negotiation with your SMB file server. You also can configure DataSync to use a specific SMB version, but we recommend doing this only if DataSync has trouble negotiating with the SMB file server automatically. These are the following options for configuring the SMB version:    AUTOMATIC (default): DataSync and the SMB file server negotiate the highest version of SMB that they mutually support between 2.1 and 3.1.1. This is the recommended option. If you instead choose a specific version that your file server doesn't support, you may get an Operation Not Supported error.    SMB3: Restricts the protocol negotiation to only SMB version 3.0.2.    SMB2: Restricts the protocol negotiation to only SMB version 2.1.    SMB2_0: Restricts the protocol negotiation to only SMB version 2.0.    SMB1: Restricts the protocol negotiation to only SMB version 1.0.  The SMB1 option isn't available when creating an Amazon FSx for NetApp ONTAP location.
        public let version: SmbVersion?

        @inlinable
        public init(version: SmbVersion? = nil) {
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case version = "Version"
        }
    }

    public struct SourceManifestConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the S3 bucket where you're hosting your manifest.
        public let s3: S3ManifestConfig

        @inlinable
        public init(s3: S3ManifestConfig) {
            self.s3 = s3
        }

        public func validate(name: String) throws {
            try self.s3.validate(name: "\(name).s3")
        }

        private enum CodingKeys: String, CodingKey {
            case s3 = "S3"
        }
    }

    public struct StartTaskExecutionRequest: AWSEncodableShape {
        /// Specifies a list of filter rules that determines which files to exclude from a task. The list contains a single filter string that consists of the patterns to exclude. The patterns are delimited by "|" (that is, a pipe), for example, "/folder1|/folder2".
        public let excludes: [FilterRule]?
        /// Specifies a list of filter rules that determines which files to include when running a task. The pattern should contain a single filter string that consists of the patterns to include. The patterns are delimited by "|" (that is, a pipe), for example, "/folder1|/folder2".
        public let includes: [FilterRule]?
        /// Configures a manifest, which is a list of files or objects that you want DataSync to transfer. For more information and configuration examples, see Specifying what DataSync transfers by using a manifest. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a manifest configuration, specify this parameter with an empty value.
        public let manifestConfig: ManifestConfig?
        public let overrideOptions: Options?
        /// Specifies the tags that you want to apply to the Amazon Resource Name (ARN) representing the task execution.  Tags are key-value pairs that help you manage, filter, and search for your DataSync resources.
        public let tags: [TagListEntry]?
        /// Specifies the Amazon Resource Name (ARN) of the task that you want to start.
        public let taskArn: String
        /// Specifies how you want to configure a task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a task report configuration, specify this parameter as empty.
        public let taskReportConfig: TaskReportConfig?

        @inlinable
        public init(excludes: [FilterRule]? = nil, includes: [FilterRule]? = nil, manifestConfig: ManifestConfig? = nil, overrideOptions: Options? = nil, tags: [TagListEntry]? = nil, taskArn: String, taskReportConfig: TaskReportConfig? = nil) {
            self.excludes = excludes
            self.includes = includes
            self.manifestConfig = manifestConfig
            self.overrideOptions = overrideOptions
            self.tags = tags
            self.taskArn = taskArn
            self.taskReportConfig = taskReportConfig
        }

        public func validate(name: String) throws {
            try self.excludes?.forEach {
                try $0.validate(name: "\(name).excludes[]")
            }
            try self.validate(self.excludes, name: "excludes", parent: name, max: 1)
            try self.includes?.forEach {
                try $0.validate(name: "\(name).includes[]")
            }
            try self.validate(self.includes, name: "includes", parent: name, max: 1)
            try self.manifestConfig?.validate(name: "\(name).manifestConfig")
            try self.overrideOptions?.validate(name: "\(name).overrideOptions")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 128)
            try self.validate(self.taskArn, name: "taskArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}$")
            try self.taskReportConfig?.validate(name: "\(name).taskReportConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case excludes = "Excludes"
            case includes = "Includes"
            case manifestConfig = "ManifestConfig"
            case overrideOptions = "OverrideOptions"
            case tags = "Tags"
            case taskArn = "TaskArn"
            case taskReportConfig = "TaskReportConfig"
        }
    }

    public struct StartTaskExecutionResponse: AWSDecodableShape {
        /// The ARN of the running task execution.
        public let taskExecutionArn: String?

        @inlinable
        public init(taskExecutionArn: String? = nil) {
            self.taskExecutionArn = taskExecutionArn
        }

        private enum CodingKeys: String, CodingKey {
            case taskExecutionArn = "TaskExecutionArn"
        }
    }

    public struct TagListEntry: AWSEncodableShape & AWSDecodableShape {
        /// The key for an Amazon Web Services resource tag.
        public let key: String
        /// The value for an Amazon Web Services resource tag.
        public let value: String?

        @inlinable
        public init(key: String, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 256)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:/-]+$")
            try self.validate(self.value, name: "value", parent: name, max: 256)
            try self.validate(self.value, name: "value", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:@/-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the resource to apply the tag to.
        public let resourceArn: String
        /// Specifies the tags that you want to apply to the resource.
        public let tags: [TagListEntry]

        @inlinable
        public init(resourceArn: String, tags: [TagListEntry]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 128)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:(agent|task|location|system)/((agent|task|loc)-[a-f0-9]{17}|storage-system-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})(/execution/exec-[a-f0-9]{17})?$")
            try self.tags.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tags = "Tags"
        }
    }

    public struct TagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct TaskExecutionFilesFailedDetail: AWSDecodableShape {
        /// The number of objects that DataSync fails to delete during your task execution.
        public let delete: Int64?
        /// The number of objects that DataSync fails to prepare during your task execution.
        public let prepare: Int64?
        /// The number of objects that DataSync fails to transfer during your task execution.
        public let transfer: Int64?
        /// The number of objects that DataSync fails to verify during your task execution.
        public let verify: Int64?

        @inlinable
        public init(delete: Int64? = nil, prepare: Int64? = nil, transfer: Int64? = nil, verify: Int64? = nil) {
            self.delete = delete
            self.prepare = prepare
            self.transfer = transfer
            self.verify = verify
        }

        private enum CodingKeys: String, CodingKey {
            case delete = "Delete"
            case prepare = "Prepare"
            case transfer = "Transfer"
            case verify = "Verify"
        }
    }

    public struct TaskExecutionFilesListedDetail: AWSDecodableShape {
        /// The number of objects that DataSync finds at your destination location. This counter is only applicable if you configure your task to delete data in the destination that isn't in the source.
        public let atDestinationForDelete: Int64?
        /// The number of objects that DataSync finds at your source location.   With a manifest, DataSync lists only what's in your manifest (and not everything at your source location).   With an include filter, DataSync lists only what matches the filter at your source location.   With an exclude filter, DataSync lists everything at your source location before applying the filter.
        public let atSource: Int64?

        @inlinable
        public init(atDestinationForDelete: Int64? = nil, atSource: Int64? = nil) {
            self.atDestinationForDelete = atDestinationForDelete
            self.atSource = atSource
        }

        private enum CodingKeys: String, CodingKey {
            case atDestinationForDelete = "AtDestinationForDelete"
            case atSource = "AtSource"
        }
    }

    public struct TaskExecutionListEntry: AWSDecodableShape {
        /// The status of a task execution. For more information, see Task execution statuses.
        public let status: TaskExecutionStatus?
        /// The Amazon Resource Name (ARN) of a task execution.
        public let taskExecutionArn: String?
        /// The task mode that you're using. For more information, see Choosing a task mode for your data transfer.
        public let taskMode: TaskMode?

        @inlinable
        public init(status: TaskExecutionStatus? = nil, taskExecutionArn: String? = nil, taskMode: TaskMode? = nil) {
            self.status = status
            self.taskExecutionArn = taskExecutionArn
            self.taskMode = taskMode
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
            case taskExecutionArn = "TaskExecutionArn"
            case taskMode = "TaskMode"
        }
    }

    public struct TaskExecutionResultDetail: AWSDecodableShape {
        /// An error that DataSync encountered during your task execution. You can use this information to help troubleshoot issues.
        public let errorCode: String?
        /// The detailed description of an error that DataSync encountered during your task execution. You can use this information to help troubleshoot issues.
        public let errorDetail: String?
        /// The time in milliseconds that your task execution was in the PREPARING step. For more information, see Task execution statuses. For Enhanced mode tasks, the value is always 0. For more information, see How DataSync prepares your data transfer.
        public let prepareDuration: Int64?
        /// The status of the PREPARING step for your task execution. For more information, see Task execution statuses.
        public let prepareStatus: PhaseStatus?
        /// The time in milliseconds that your task execution ran.
        public let totalDuration: Int64?
        /// The time in milliseconds that your task execution was in the TRANSFERRING step. For more information, see Task execution statuses. For Enhanced mode tasks, the value is always 0. For more information, see How DataSync transfers your data.
        public let transferDuration: Int64?
        /// The status of the TRANSFERRING step for your task execution. For more information, see Task execution statuses.
        public let transferStatus: PhaseStatus?
        /// The time in milliseconds that your task execution was in the VERIFYING step. For more information, see Task execution statuses. For Enhanced mode tasks, the value is always 0. For more information, see How DataSync verifies your data's integrity.
        public let verifyDuration: Int64?
        /// The status of the VERIFYING step for your task execution. For more information, see Task execution statuses.
        public let verifyStatus: PhaseStatus?

        @inlinable
        public init(errorCode: String? = nil, errorDetail: String? = nil, prepareDuration: Int64? = nil, prepareStatus: PhaseStatus? = nil, totalDuration: Int64? = nil, transferDuration: Int64? = nil, transferStatus: PhaseStatus? = nil, verifyDuration: Int64? = nil, verifyStatus: PhaseStatus? = nil) {
            self.errorCode = errorCode
            self.errorDetail = errorDetail
            self.prepareDuration = prepareDuration
            self.prepareStatus = prepareStatus
            self.totalDuration = totalDuration
            self.transferDuration = transferDuration
            self.transferStatus = transferStatus
            self.verifyDuration = verifyDuration
            self.verifyStatus = verifyStatus
        }

        private enum CodingKeys: String, CodingKey {
            case errorCode = "ErrorCode"
            case errorDetail = "ErrorDetail"
            case prepareDuration = "PrepareDuration"
            case prepareStatus = "PrepareStatus"
            case totalDuration = "TotalDuration"
            case transferDuration = "TransferDuration"
            case transferStatus = "TransferStatus"
            case verifyDuration = "VerifyDuration"
            case verifyStatus = "VerifyStatus"
        }
    }

    public struct TaskFilter: AWSEncodableShape {
        /// The name of the filter being used. Each API call supports a list of filters that are available for it. For example, LocationId for ListTasks.
        public let name: TaskFilterName
        /// The operator that is used to compare filter values (for example, Equals or Contains).
        public let `operator`: Operator
        /// The values that you want to filter for. For example, you might want to display only tasks for a specific destination location.
        public let values: [String]

        @inlinable
        public init(name: TaskFilterName, operator: Operator, values: [String]) {
            self.name = name
            self.`operator` = `operator`
            self.values = values
        }

        public func validate(name: String) throws {
            try self.values.forEach {
                try validate($0, name: "values[]", parent: name, max: 255)
                try validate($0, name: "values[]", parent: name, min: 1)
                try validate($0, name: "values[]", parent: name, pattern: "^[0-9a-zA-Z_\\ \\-\\:\\*\\.\\\\/\\?-]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct TaskListEntry: AWSDecodableShape {
        /// The name of the task.
        public let name: String?
        /// The status of the task.
        public let status: TaskStatus?
        /// The Amazon Resource Name (ARN) of the task.
        public let taskArn: String?
        /// The task mode that you're using. For more information, see Choosing a task mode for your data transfer.
        public let taskMode: TaskMode?

        @inlinable
        public init(name: String? = nil, status: TaskStatus? = nil, taskArn: String? = nil, taskMode: TaskMode? = nil) {
            self.name = name
            self.status = status
            self.taskArn = taskArn
            self.taskMode = taskMode
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case status = "Status"
            case taskArn = "TaskArn"
            case taskMode = "TaskMode"
        }
    }

    public struct TaskReportConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Amazon S3 bucket where DataSync uploads your task report. For more information, see Task reports.
        public let destination: ReportDestination?
        /// Specifies whether your task report includes the new version of each object transferred into an S3 bucket. This only applies if you enable versioning on your bucket. Keep in mind that setting this to INCLUDE can increase the duration of your task execution.
        public let objectVersionIds: ObjectVersionIds?
        /// Specifies the type of task report that you want:    SUMMARY_ONLY: Provides necessary details about your task, including the number of files, objects, and directories transferred and transfer duration.    STANDARD: Provides complete details about your task, including a full list of files, objects, and directories that were transferred, skipped, verified, and more.
        public let outputType: ReportOutputType?
        /// Customizes the reporting level for aspects of your task report. For example, your report might generally only include errors, but you could specify that you want a list of successes and errors just for the files that DataSync attempted to delete in your destination location.
        public let overrides: ReportOverrides?
        /// Specifies whether you want your task report to include only what went wrong with your transfer or a list of what succeeded and didn't.    ERRORS_ONLY: A report shows what DataSync was unable to transfer, skip, verify, and delete.    SUCCESSES_AND_ERRORS: A report shows what DataSync was able and unable to transfer, skip, verify, and delete.
        public let reportLevel: ReportLevel?

        @inlinable
        public init(destination: ReportDestination? = nil, objectVersionIds: ObjectVersionIds? = nil, outputType: ReportOutputType? = nil, overrides: ReportOverrides? = nil, reportLevel: ReportLevel? = nil) {
            self.destination = destination
            self.objectVersionIds = objectVersionIds
            self.outputType = outputType
            self.overrides = overrides
            self.reportLevel = reportLevel
        }

        public func validate(name: String) throws {
            try self.destination?.validate(name: "\(name).destination")
        }

        private enum CodingKeys: String, CodingKey {
            case destination = "Destination"
            case objectVersionIds = "ObjectVersionIds"
            case outputType = "OutputType"
            case overrides = "Overrides"
            case reportLevel = "ReportLevel"
        }
    }

    public struct TaskSchedule: AWSEncodableShape & AWSDecodableShape {
        /// Specifies your task schedule by using a cron or rate expression. Use cron expressions for task schedules that run on a specific time and day. For example, the following cron expression creates a task schedule that runs at 8 AM on the first Wednesday of every month:  cron(0 8 * * 3#1)  Use rate expressions for task schedules that run on a regular interval. For example, the following rate expression creates a task schedule that runs every 12 hours:  rate(12 hours)  For information about cron and rate expression syntax, see the  Amazon EventBridge User Guide .
        public let scheduleExpression: String
        /// Specifies whether to enable or disable your task schedule. Your schedule is enabled by default, but there can be situations where you need to disable it. For example, you might need to pause a recurring transfer to fix an issue with your task or perform maintenance on your storage system. DataSync might disable your schedule automatically if your task fails repeatedly with the same error. For more information, see TaskScheduleDetails.
        public let status: ScheduleStatus?

        @inlinable
        public init(scheduleExpression: String, status: ScheduleStatus? = nil) {
            self.scheduleExpression = scheduleExpression
            self.status = status
        }

        public func validate(name: String) throws {
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, max: 256)
            try self.validate(self.scheduleExpression, name: "scheduleExpression", parent: name, pattern: "^[a-zA-Z0-9\\ \\_\\*\\?\\,\\|\\^\\-\\/\\#\\s\\(\\)\\+]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case scheduleExpression = "ScheduleExpression"
            case status = "Status"
        }
    }

    public struct TaskScheduleDetails: AWSDecodableShape {
        /// Indicates how your task schedule was disabled.    USER - Your schedule was manually disabled by using the UpdateTask operation or DataSync console.    SERVICE - Your schedule was automatically disabled by DataSync because the task failed repeatedly with the same error.
        public let disabledBy: ScheduleDisabledBy?
        /// Provides a reason if the task schedule is disabled. If your schedule is disabled by USER, you see a Manually disabled by user. message. If your schedule is disabled by SERVICE, you see an error message to help you understand why the task keeps failing. For information on resolving DataSync errors, see Troubleshooting issues with DataSync transfers.
        public let disabledReason: String?
        /// Indicates the last time the status of your task schedule changed. For example, if DataSync automatically disables your schedule because of a repeated error, you can see when the schedule was disabled.
        public let statusUpdateTime: Date?

        @inlinable
        public init(disabledBy: ScheduleDisabledBy? = nil, disabledReason: String? = nil, statusUpdateTime: Date? = nil) {
            self.disabledBy = disabledBy
            self.disabledReason = disabledReason
            self.statusUpdateTime = statusUpdateTime
        }

        private enum CodingKeys: String, CodingKey {
            case disabledBy = "DisabledBy"
            case disabledReason = "DisabledReason"
            case statusUpdateTime = "StatusUpdateTime"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        /// Specifies the keys in the tags that you want to remove.
        public let keys: [String]
        /// Specifies the Amazon Resource Name (ARN) of the resource to remove the tags from.
        public let resourceArn: String

        @inlinable
        public init(keys: [String], resourceArn: String) {
            self.keys = keys
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.keys.forEach {
                try validate($0, name: "keys[]", parent: name, max: 256)
                try validate($0, name: "keys[]", parent: name, min: 1)
                try validate($0, name: "keys[]", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:/-]+$")
            }
            try self.validate(self.keys, name: "keys", parent: name, max: 50)
            try self.validate(self.keys, name: "keys", parent: name, min: 1)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 128)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:(agent|task|location|system)/((agent|task|loc)-[a-f0-9]{17}|storage-system-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})(/execution/exec-[a-f0-9]{17})?$")
        }

        private enum CodingKeys: String, CodingKey {
            case keys = "Keys"
            case resourceArn = "ResourceArn"
        }
    }

    public struct UntagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateAgentRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the agent to update.
        public let agentArn: String
        /// The name that you want to use to configure the agent.
        public let name: String?

        @inlinable
        public init(agentArn: String, name: String? = nil) {
            self.agentArn = agentArn
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.agentArn, name: "agentArn", parent: name, max: 128)
            try self.validate(self.agentArn, name: "agentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            try self.validate(self.name, name: "name", parent: name, max: 256)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:@/-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case agentArn = "AgentArn"
            case name = "Name"
        }
    }

    public struct UpdateAgentResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationAzureBlobRequest: AWSEncodableShape {
        /// Specifies the access tier that you want your objects or files transferred into. This only applies when using the location as a transfer destination. For more information, see Access tiers.
        public let accessTier: AzureAccessTier?
        /// (Optional) Specifies the Amazon Resource Name (ARN) of the DataSync agent that can connect with your Azure Blob Storage container. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter. You can specify more than one agent. For more information, see Using multiple agents for your transfer.  You cannot add or remove agents from a storage location after you initially create it.
        public let agentArns: [String]?
        /// Specifies the authentication method DataSync uses to access your Azure Blob Storage. DataSync can access blob storage using a shared access signature (SAS).
        public let authenticationType: AzureBlobAuthenticationType?
        /// Specifies the type of blob that you want your objects or files to be when transferring them into Azure Blob Storage. Currently, DataSync only supports moving data into Azure Blob Storage as block blobs. For more information on blob types, see the Azure Blob Storage documentation.
        public let blobType: AzureBlobType?
        /// Specifies configuration information for a DataSync-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
        public let cmkSecretConfig: CmkSecretConfig?
        /// Specifies configuration information for a customer-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
        public let customSecretConfig: CustomSecretConfig?
        /// Specifies the ARN of the Azure Blob Storage transfer location that you're updating.
        public let locationArn: String
        /// Specifies the SAS configuration that allows DataSync to access your Azure Blob Storage.
        public let sasConfiguration: AzureBlobSasConfiguration?
        /// Specifies path segments if you want to limit your transfer to a virtual directory in your container (for example, /my/images).
        public let subdirectory: String?

        @inlinable
        public init(accessTier: AzureAccessTier? = nil, agentArns: [String]? = nil, authenticationType: AzureBlobAuthenticationType? = nil, blobType: AzureBlobType? = nil, cmkSecretConfig: CmkSecretConfig? = nil, customSecretConfig: CustomSecretConfig? = nil, locationArn: String, sasConfiguration: AzureBlobSasConfiguration? = nil, subdirectory: String? = nil) {
            self.accessTier = accessTier
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.blobType = blobType
            self.cmkSecretConfig = cmkSecretConfig
            self.customSecretConfig = customSecretConfig
            self.locationArn = locationArn
            self.sasConfiguration = sasConfiguration
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.cmkSecretConfig?.validate(name: "\(name).cmkSecretConfig")
            try self.customSecretConfig?.validate(name: "\(name).customSecretConfig")
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.sasConfiguration?.validate(name: "\(name).sasConfiguration")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 1024)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[\\p{L}\\p{M}\\p{Z}\\p{S}\\p{N}\\p{P}\\p{C}]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case accessTier = "AccessTier"
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case blobType = "BlobType"
            case cmkSecretConfig = "CmkSecretConfig"
            case customSecretConfig = "CustomSecretConfig"
            case locationArn = "LocationArn"
            case sasConfiguration = "SasConfiguration"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationAzureBlobResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationEfsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the access point that DataSync uses to mount your Amazon EFS file system. For more information, see Accessing restricted Amazon EFS file systems.
        public let accessPointArn: String?
        /// Specifies an Identity and Access Management (IAM) role that allows DataSync to access your Amazon EFS file system. For information on creating this role, see Creating a DataSync IAM role for Amazon EFS file system access.
        public let fileSystemAccessRoleArn: String?
        /// Specifies whether you want DataSync to use Transport Layer Security (TLS) 1.2 encryption when it transfers data to or from your Amazon EFS file system. If you specify an access point using AccessPointArn or an IAM role using FileSystemAccessRoleArn, you must set this parameter to TLS1_2.
        public let inTransitEncryption: EfsInTransitEncryption?
        /// Specifies the Amazon Resource Name (ARN) of the Amazon EFS transfer location that you're updating.
        public let locationArn: String
        /// Specifies a mount path for your Amazon EFS file system. This is where DataSync reads or writes data on your file system (depending on if this is a source or destination location). By default, DataSync uses the root directory (or access point if you provide one by using AccessPointArn). You can also include subdirectories using forward slashes (for example, /path/to/folder).
        public let subdirectory: String?

        @inlinable
        public init(accessPointArn: String? = nil, fileSystemAccessRoleArn: String? = nil, inTransitEncryption: EfsInTransitEncryption? = nil, locationArn: String, subdirectory: String? = nil) {
            self.accessPointArn = accessPointArn
            self.fileSystemAccessRoleArn = fileSystemAccessRoleArn
            self.inTransitEncryption = inTransitEncryption
            self.locationArn = locationArn
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.accessPointArn, name: "accessPointArn", parent: name, max: 128)
            try self.validate(self.accessPointArn, name: "accessPointArn", parent: name, pattern: "^(^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):elasticfilesystem:[a-z\\-0-9]+:[0-9]{12}:access-point/fsap-[0-9a-f]{8,40}$)|(^$)$")
            try self.validate(self.fileSystemAccessRoleArn, name: "fileSystemAccessRoleArn", parent: name, max: 2048)
            try self.validate(self.fileSystemAccessRoleArn, name: "fileSystemAccessRoleArn", parent: name, pattern: "^(^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$)|(^$)$")
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case accessPointArn = "AccessPointArn"
            case fileSystemAccessRoleArn = "FileSystemAccessRoleArn"
            case inTransitEncryption = "InTransitEncryption"
            case locationArn = "LocationArn"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationEfsResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationFsxLustreRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the FSx for Lustre transfer location that you're updating.
        public let locationArn: String
        /// Specifies a mount path for your FSx for Lustre file system. The path can include subdirectories. When the location is used as a source, DataSync reads data from the mount path. When the location is used as a destination, DataSync writes data to the mount path. If you don't include this parameter, DataSync uses the file system's root directory (/).
        public let subdirectory: String?

        @inlinable
        public init(locationArn: String, subdirectory: String? = nil) {
            self.locationArn = locationArn
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationFsxLustreResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationFsxOntapRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the FSx for ONTAP transfer location that you're updating.
        public let locationArn: String
        /// Specifies the data transfer protocol that DataSync uses to access your Amazon FSx file system.
        public let `protocol`: FsxUpdateProtocol?
        /// Specifies a path to the file share in the storage virtual machine (SVM) where you want to transfer data to or from. You can specify a junction path (also known as a mount point), qtree path (for NFS file shares), or share name (for SMB file shares). For example, your mount path might be /vol1, /vol1/tree1, or /share1.  Don't specify a junction path in the SVM's root volume. For more information, see Managing FSx for ONTAP storage virtual machines in the Amazon FSx for NetApp ONTAP User Guide.
        public let subdirectory: String?

        @inlinable
        public init(locationArn: String, protocol: FsxUpdateProtocol? = nil, subdirectory: String? = nil) {
            self.locationArn = locationArn
            self.`protocol` = `protocol`
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.`protocol`?.validate(name: "\(name).`protocol`")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 255)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[^\\u0000\\u0085\\u2028\\u2029\\r\\n]{1,255}$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
            case `protocol` = "Protocol"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationFsxOntapResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationFsxOpenZfsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the FSx for OpenZFS transfer location that you're updating.
        public let locationArn: String
        public let `protocol`: FsxProtocol?
        /// Specifies a subdirectory in the location's path that must begin with /fsx. DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).
        public let subdirectory: String?

        @inlinable
        public init(locationArn: String, protocol: FsxProtocol? = nil, subdirectory: String? = nil) {
            self.locationArn = locationArn
            self.`protocol` = `protocol`
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.`protocol`?.validate(name: "\(name).`protocol`")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
            case `protocol` = "Protocol"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationFsxOpenZfsResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationFsxWindowsRequest: AWSEncodableShape {
        /// Specifies the name of the Windows domain that your FSx for Windows File Server file system belongs to. If you have multiple Active Directory domains in your environment, configuring this parameter makes sure that DataSync connects to the right file system.
        public let domain: String?
        /// Specifies the ARN of the FSx for Windows File Server transfer location that you're updating.
        public let locationArn: String
        /// Specifies the password of the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system.
        public let password: String?
        /// Specifies a mount path for your file system using forward slashes. DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).
        public let subdirectory: String?
        /// Specifies the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system. For information about choosing a user with the right level of access for your transfer, see required permissions for FSx for Windows File Server locations.
        public let user: String?

        @inlinable
        public init(domain: String? = nil, locationArn: String, password: String? = nil, subdirectory: String? = nil, user: String? = nil) {
            self.domain = domain
            self.locationArn = locationArn
            self.password = password
            self.subdirectory = subdirectory
            self.user = user
        }

        public func validate(name: String) throws {
            try self.validate(self.domain, name: "domain", parent: name, max: 253)
            try self.validate(self.domain, name: "domain", parent: name, pattern: "^([A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252})?$")
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.validate(self.password, name: "password", parent: name, max: 104)
            try self.validate(self.password, name: "password", parent: name, pattern: "^.{0,104}$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
            try self.validate(self.user, name: "user", parent: name, max: 104)
            try self.validate(self.user, name: "user", parent: name, pattern: "^[^\\x22\\x5B\\x5D/\\\\:;|=,+*?\\x3C\\x3E]{1,104}$")
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case locationArn = "LocationArn"
            case password = "Password"
            case subdirectory = "Subdirectory"
            case user = "User"
        }
    }

    public struct UpdateLocationFsxWindowsResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationHdfsRequest: AWSEncodableShape {
        /// The Amazon Resource Names (ARNs) of the DataSync agents that can connect to your HDFS cluster.
        public let agentArns: [String]?
        /// The type of authentication used to determine the identity of the user.
        public let authenticationType: HdfsAuthenticationType?
        /// The size of the data blocks to write into the HDFS cluster.
        public let blockSize: Int?
        /// The Kerberos key table (keytab) that contains mappings between the defined Kerberos principal and the encrypted keys. You can load the keytab from a file by providing the file's address.
        public let kerberosKeytab: AWSBase64Data?
        /// The krb5.conf file that contains the Kerberos configuration information. You can load the krb5.conf file by providing the file's address. If you're using the CLI, it performs the base64 encoding for you. Otherwise, provide the base64-encoded text.
        public let kerberosKrb5Conf: AWSBase64Data?
        /// The Kerberos principal with access to the files and folders on the HDFS cluster.
        public let kerberosPrincipal: String?
        /// The URI of the HDFS cluster's Key Management Server (KMS).
        public let kmsKeyProviderUri: String?
        /// The Amazon Resource Name (ARN) of the source HDFS cluster location.
        public let locationArn: String
        /// The NameNode that manages the HDFS namespace. The NameNode performs operations such as opening, closing, and renaming files and directories. The NameNode contains the information to map blocks of data to the DataNodes. You can use only one NameNode.
        public let nameNodes: [HdfsNameNode]?
        /// The Quality of Protection (QOP) configuration specifies the Remote Procedure Call (RPC) and data transfer privacy settings configured on the Hadoop Distributed File System (HDFS) cluster.
        public let qopConfiguration: QopConfiguration?
        /// The number of DataNodes to replicate the data to when writing to the HDFS cluster.
        public let replicationFactor: Int?
        /// The user name used to identify the client on the host operating system.
        public let simpleUser: String?
        /// A subdirectory in the HDFS cluster. This subdirectory is used to read data from or write data to the HDFS cluster.
        public let subdirectory: String?

        @inlinable
        public init(agentArns: [String]? = nil, authenticationType: HdfsAuthenticationType? = nil, blockSize: Int? = nil, kerberosKeytab: AWSBase64Data? = nil, kerberosKrb5Conf: AWSBase64Data? = nil, kerberosPrincipal: String? = nil, kmsKeyProviderUri: String? = nil, locationArn: String, nameNodes: [HdfsNameNode]? = nil, qopConfiguration: QopConfiguration? = nil, replicationFactor: Int? = nil, simpleUser: String? = nil, subdirectory: String? = nil) {
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.blockSize = blockSize
            self.kerberosKeytab = kerberosKeytab
            self.kerberosKrb5Conf = kerberosKrb5Conf
            self.kerberosPrincipal = kerberosPrincipal
            self.kmsKeyProviderUri = kmsKeyProviderUri
            self.locationArn = locationArn
            self.nameNodes = nameNodes
            self.qopConfiguration = qopConfiguration
            self.replicationFactor = replicationFactor
            self.simpleUser = simpleUser
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.validate(self.blockSize, name: "blockSize", parent: name, max: 1073741824)
            try self.validate(self.blockSize, name: "blockSize", parent: name, min: 1048576)
            try self.validate(self.kerberosKeytab, name: "kerberosKeytab", parent: name, max: 65536)
            try self.validate(self.kerberosKrb5Conf, name: "kerberosKrb5Conf", parent: name, max: 131072)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, max: 256)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, min: 1)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, pattern: "^.+$")
            try self.validate(self.kmsKeyProviderUri, name: "kmsKeyProviderUri", parent: name, max: 255)
            try self.validate(self.kmsKeyProviderUri, name: "kmsKeyProviderUri", parent: name, min: 1)
            try self.validate(self.kmsKeyProviderUri, name: "kmsKeyProviderUri", parent: name, pattern: "^kms:\\/\\/http[s]?@(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-]*[A-Za-z0-9])(;(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-]*[A-Za-z0-9]))*:[0-9]{1,5}\\/kms$")
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.nameNodes?.forEach {
                try $0.validate(name: "\(name).nameNodes[]")
            }
            try self.validate(self.nameNodes, name: "nameNodes", parent: name, min: 1)
            try self.validate(self.replicationFactor, name: "replicationFactor", parent: name, max: 512)
            try self.validate(self.replicationFactor, name: "replicationFactor", parent: name, min: 1)
            try self.validate(self.simpleUser, name: "simpleUser", parent: name, max: 256)
            try self.validate(self.simpleUser, name: "simpleUser", parent: name, min: 1)
            try self.validate(self.simpleUser, name: "simpleUser", parent: name, pattern: "^[_.A-Za-z0-9][-_.A-Za-z0-9]*$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case blockSize = "BlockSize"
            case kerberosKeytab = "KerberosKeytab"
            case kerberosKrb5Conf = "KerberosKrb5Conf"
            case kerberosPrincipal = "KerberosPrincipal"
            case kmsKeyProviderUri = "KmsKeyProviderUri"
            case locationArn = "LocationArn"
            case nameNodes = "NameNodes"
            case qopConfiguration = "QopConfiguration"
            case replicationFactor = "ReplicationFactor"
            case simpleUser = "SimpleUser"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationHdfsResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationNfsRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the NFS transfer location that you want to update.
        public let locationArn: String
        public let mountOptions: NfsMountOptions?
        public let onPremConfig: OnPremConfig?
        /// Specifies the DNS name or IP address (IPv4 or IPv6) of the NFS file server that your DataSync agent connects to.
        public let serverHostname: String?
        /// Specifies the export path in your NFS file server that you want DataSync to mount. This path (or a subdirectory of the path) is where DataSync transfers data to or from. For information on configuring an export for DataSync, see Accessing NFS file servers.
        public let subdirectory: String?

        @inlinable
        public init(locationArn: String, mountOptions: NfsMountOptions? = nil, onPremConfig: OnPremConfig? = nil, serverHostname: String? = nil, subdirectory: String? = nil) {
            self.locationArn = locationArn
            self.mountOptions = mountOptions
            self.onPremConfig = onPremConfig
            self.serverHostname = serverHostname
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.onPremConfig?.validate(name: "\(name).onPremConfig")
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, max: 255)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-:]*[A-Za-z0-9])$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
            case mountOptions = "MountOptions"
            case onPremConfig = "OnPremConfig"
            case serverHostname = "ServerHostname"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationNfsResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationObjectStorageRequest: AWSEncodableShape {
        /// Specifies the access key (for example, a user name) if credentials are required to authenticate with the object storage server.
        public let accessKey: String?
        /// (Optional) Specifies the Amazon Resource Names (ARNs) of the DataSync agents that can connect with your object storage system. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter.  You cannot add or remove agents from a storage location after you initially create it.
        public let agentArns: [String]?
        /// Specifies configuration information for a DataSync-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
        public let cmkSecretConfig: CmkSecretConfig?
        /// Specifies configuration information for a customer-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
        public let customSecretConfig: CustomSecretConfig?
        /// Specifies the ARN of the object storage system location that you're updating.
        public let locationArn: String
        /// Specifies the secret key (for example, a password) if credentials are required to authenticate with the object storage server.  If you provide a secret using SecretKey, but do not provide secret configuration details using CmkSecretConfig or CustomSecretConfig, then DataSync stores the token using your Amazon Web Services account's Secrets Manager secret.
        public let secretKey: String?
        /// Specifies a certificate chain for DataSync to authenticate with your object storage system if the system uses a private or self-signed certificate authority (CA). You must specify a single .pem file with a full certificate chain (for example, file:///home/user/.ssh/object_storage_certificates.pem). The certificate chain might include:   The object storage system's certificate   All intermediate certificates (if there are any)   The root certificate of the signing CA   You can concatenate your certificates into a .pem file (which can be up to 32768 bytes before base64 encoding). The following example cat command creates an object_storage_certificates.pem file that includes three certificates:  cat object_server_certificate.pem intermediate_certificate.pem ca_root_certificate.pem > object_storage_certificates.pem  To use this parameter, configure ServerProtocol to HTTPS. Updating this parameter doesn't interfere with tasks that you have in progress.
        public let serverCertificate: AWSBase64Data?
        /// Specifies the domain name or IP address (IPv4 or IPv6) of the object storage server that your DataSync agent connects to.
        public let serverHostname: String?
        /// Specifies the port that your object storage server accepts inbound network traffic on (for example, port 443).
        public let serverPort: Int?
        /// Specifies the protocol that your object storage server uses to communicate.
        public let serverProtocol: ObjectStorageServerProtocol?
        /// Specifies the object prefix for your object storage server. If this is a source location, DataSync only copies objects with this prefix. If this is a destination location, DataSync writes all objects with this prefix.
        public let subdirectory: String?

        @inlinable
        public init(accessKey: String? = nil, agentArns: [String]? = nil, cmkSecretConfig: CmkSecretConfig? = nil, customSecretConfig: CustomSecretConfig? = nil, locationArn: String, secretKey: String? = nil, serverCertificate: AWSBase64Data? = nil, serverHostname: String? = nil, serverPort: Int? = nil, serverProtocol: ObjectStorageServerProtocol? = nil, subdirectory: String? = nil) {
            self.accessKey = accessKey
            self.agentArns = agentArns
            self.cmkSecretConfig = cmkSecretConfig
            self.customSecretConfig = customSecretConfig
            self.locationArn = locationArn
            self.secretKey = secretKey
            self.serverCertificate = serverCertificate
            self.serverHostname = serverHostname
            self.serverPort = serverPort
            self.serverProtocol = serverProtocol
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.accessKey, name: "accessKey", parent: name, max: 200)
            try self.validate(self.accessKey, name: "accessKey", parent: name, pattern: "^.*$")
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.cmkSecretConfig?.validate(name: "\(name).cmkSecretConfig")
            try self.customSecretConfig?.validate(name: "\(name).customSecretConfig")
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.validate(self.secretKey, name: "secretKey", parent: name, max: 200)
            try self.validate(self.secretKey, name: "secretKey", parent: name, pattern: "^.*$")
            try self.validate(self.serverCertificate, name: "serverCertificate", parent: name, max: 32768)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, max: 255)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-:]*[A-Za-z0-9])$")
            try self.validate(self.serverPort, name: "serverPort", parent: name, max: 65536)
            try self.validate(self.serverPort, name: "serverPort", parent: name, min: 1)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case accessKey = "AccessKey"
            case agentArns = "AgentArns"
            case cmkSecretConfig = "CmkSecretConfig"
            case customSecretConfig = "CustomSecretConfig"
            case locationArn = "LocationArn"
            case secretKey = "SecretKey"
            case serverCertificate = "ServerCertificate"
            case serverHostname = "ServerHostname"
            case serverPort = "ServerPort"
            case serverProtocol = "ServerProtocol"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationObjectStorageResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationS3Request: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of the Amazon S3 transfer location that you're updating.
        public let locationArn: String
        public let s3Config: S3Config?
        /// Specifies the storage class that you want your objects to use when Amazon S3 is a transfer destination. For buckets in Amazon Web Services Regions, the storage class defaults to STANDARD. For buckets on Outposts, the storage class defaults to OUTPOSTS. For more information, see Storage class considerations with Amazon S3 transfers.
        public let s3StorageClass: S3StorageClass?
        /// Specifies a prefix in the S3 bucket that DataSync reads from or writes to (depending on whether the bucket is a source or destination location).  DataSync can't transfer objects with a prefix that begins with a slash (/) or includes //, /./, or /../ patterns. For example:    /photos     photos//2006/January     photos/./2006/February     photos/../2006/March
        public let subdirectory: String?

        @inlinable
        public init(locationArn: String, s3Config: S3Config? = nil, s3StorageClass: S3StorageClass? = nil, subdirectory: String? = nil) {
            self.locationArn = locationArn
            self.s3Config = s3Config
            self.s3StorageClass = s3StorageClass
            self.subdirectory = subdirectory
        }

        public func validate(name: String) throws {
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.s3Config?.validate(name: "\(name).s3Config")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\p{Zs}]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case locationArn = "LocationArn"
            case s3Config = "S3Config"
            case s3StorageClass = "S3StorageClass"
            case subdirectory = "Subdirectory"
        }
    }

    public struct UpdateLocationS3Response: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateLocationSmbRequest: AWSEncodableShape {
        /// Specifies the DataSync agent (or agents) that can connect to your SMB file server. You specify an agent by using its Amazon Resource Name (ARN).
        public let agentArns: [String]?
        /// Specifies the authentication protocol that DataSync uses to connect to your SMB file server. DataSync supports NTLM (default) and KERBEROS authentication. For more information, see Providing DataSync access to SMB file servers.
        public let authenticationType: SmbAuthenticationType?
        /// Specifies the IP addresses (IPv4 or IPv6) for the DNS servers that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to KERBEROS. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right SMB file server.
        public let dnsIpAddresses: [String]?
        /// Specifies the Windows domain name that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to NTLM. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right file server.
        public let domain: String?
        /// Specifies your Kerberos key table (keytab) file, which includes mappings between your Kerberos principal and encryption keys. To avoid task execution errors, make sure that the Kerberos principal that you use to create the keytab file matches exactly what you specify for KerberosPrincipal.
        public let kerberosKeytab: AWSBase64Data?
        /// Specifies a Kerberos configuration file (krb5.conf) that defines your Kerberos realm configuration. The file must be base64 encoded. If you're using the CLI, the encoding is done for you.
        public let kerberosKrb5Conf: AWSBase64Data?
        /// Specifies a Kerberos prinicpal, which is an identity in your Kerberos realm that has permission to access the files, folders, and file metadata in your SMB file server. A Kerberos principal might look like HOST/kerberosuser@MYDOMAIN.ORG. Principal names are case sensitive. Your DataSync task execution will fail if the principal that you specify for this parameter doesn’t exactly match the principal that you use to create the keytab file.
        public let kerberosPrincipal: String?
        /// Specifies the ARN of the SMB location that you want to update.
        public let locationArn: String
        public let mountOptions: SmbMountOptions?
        /// Specifies the password of the user who can mount your SMB file server and has permission to access the files and folders involved in your transfer. This parameter applies only if AuthenticationType is set to NTLM.
        public let password: String?
        /// Specifies the domain name or IP address (IPv4 or IPv6) of the SMB file server that your DataSync agent connects to.  If you're using Kerberos authentication, you must specify a domain name.
        public let serverHostname: String?
        /// Specifies the name of the share exported by your SMB file server where DataSync will read or write data. You can include a subdirectory in the share path (for example, /path/to/subdirectory). Make sure that other SMB clients in your network can also mount this path. To copy all data in the specified subdirectory, DataSync must be able to mount the SMB share and access all of its data. For more information, see Providing DataSync access to SMB file servers.
        public let subdirectory: String?
        /// Specifies the user name that can mount your SMB file server and has permission to access the files and folders involved in your transfer. This parameter applies only if AuthenticationType is set to NTLM. For information about choosing a user with the right level of access for your transfer, see Providing DataSync access to SMB file servers.
        public let user: String?

        @inlinable
        public init(agentArns: [String]? = nil, authenticationType: SmbAuthenticationType? = nil, dnsIpAddresses: [String]? = nil, domain: String? = nil, kerberosKeytab: AWSBase64Data? = nil, kerberosKrb5Conf: AWSBase64Data? = nil, kerberosPrincipal: String? = nil, locationArn: String, mountOptions: SmbMountOptions? = nil, password: String? = nil, serverHostname: String? = nil, subdirectory: String? = nil, user: String? = nil) {
            self.agentArns = agentArns
            self.authenticationType = authenticationType
            self.dnsIpAddresses = dnsIpAddresses
            self.domain = domain
            self.kerberosKeytab = kerberosKeytab
            self.kerberosKrb5Conf = kerberosKrb5Conf
            self.kerberosPrincipal = kerberosPrincipal
            self.locationArn = locationArn
            self.mountOptions = mountOptions
            self.password = password
            self.serverHostname = serverHostname
            self.subdirectory = subdirectory
            self.user = user
        }

        public func validate(name: String) throws {
            try self.agentArns?.forEach {
                try validate($0, name: "agentArns[]", parent: name, max: 128)
                try validate($0, name: "agentArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:agent/agent-[0-9a-z]{17}$")
            }
            try self.validate(self.agentArns, name: "agentArns", parent: name, max: 4)
            try self.validate(self.agentArns, name: "agentArns", parent: name, min: 1)
            try self.dnsIpAddresses?.forEach {
                try validate($0, name: "dnsIpAddresses[]", parent: name, max: 39)
                try validate($0, name: "dnsIpAddresses[]", parent: name, min: 7)
                try validate($0, name: "dnsIpAddresses[]", parent: name, pattern: "^\\A((25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}|([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}))\\z$")
            }
            try self.validate(self.dnsIpAddresses, name: "dnsIpAddresses", parent: name, max: 2)
            try self.validate(self.domain, name: "domain", parent: name, max: 253)
            try self.validate(self.domain, name: "domain", parent: name, pattern: "^[A-Za-z0-9]((\\.|-+)?[A-Za-z0-9]){0,252}$")
            try self.validate(self.kerberosKeytab, name: "kerberosKeytab", parent: name, max: 65536)
            try self.validate(self.kerberosKrb5Conf, name: "kerberosKrb5Conf", parent: name, max: 131072)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, max: 256)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, min: 1)
            try self.validate(self.kerberosPrincipal, name: "kerberosPrincipal", parent: name, pattern: "^.+$")
            try self.validate(self.locationArn, name: "locationArn", parent: name, max: 128)
            try self.validate(self.locationArn, name: "locationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]+:[0-9]{12}:location/loc-[0-9a-z]{17}$")
            try self.validate(self.password, name: "password", parent: name, max: 104)
            try self.validate(self.password, name: "password", parent: name, pattern: "^.{0,104}$")
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, max: 255)
            try self.validate(self.serverHostname, name: "serverHostname", parent: name, pattern: "^(([a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9\\-:]*[A-Za-z0-9])$")
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, max: 4096)
            try self.validate(self.subdirectory, name: "subdirectory", parent: name, pattern: "^[a-zA-Z0-9_\\-\\+\\./\\(\\)\\$\\p{Zs}]+$")
            try self.validate(self.user, name: "user", parent: name, max: 104)
            try self.validate(self.user, name: "user", parent: name, pattern: "^[^\\x22\\x5B\\x5D/\\\\:;|=,+*?\\x3C\\x3E]{1,104}$")
        }

        private enum CodingKeys: String, CodingKey {
            case agentArns = "AgentArns"
            case authenticationType = "AuthenticationType"
            case dnsIpAddresses = "DnsIpAddresses"
            case domain = "Domain"
            case kerberosKeytab = "KerberosKeytab"
            case kerberosKrb5Conf = "KerberosKrb5Conf"
            case kerberosPrincipal = "KerberosPrincipal"
            case locationArn = "LocationArn"
            case mountOptions = "MountOptions"
            case password = "Password"
            case serverHostname = "ServerHostname"
            case subdirectory = "Subdirectory"
            case user = "User"
        }
    }

    public struct UpdateLocationSmbResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateTaskExecutionRequest: AWSEncodableShape {
        public let options: Options
        /// Specifies the Amazon Resource Name (ARN) of the task execution that you're updating.
        public let taskExecutionArn: String

        @inlinable
        public init(options: Options, taskExecutionArn: String) {
            self.options = options
            self.taskExecutionArn = taskExecutionArn
        }

        public func validate(name: String) throws {
            try self.options.validate(name: "\(name).options")
            try self.validate(self.taskExecutionArn, name: "taskExecutionArn", parent: name, max: 128)
            try self.validate(self.taskExecutionArn, name: "taskExecutionArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}/execution/exec-[0-9a-f]{17}$")
        }

        private enum CodingKeys: String, CodingKey {
            case options = "Options"
            case taskExecutionArn = "TaskExecutionArn"
        }
    }

    public struct UpdateTaskExecutionResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateTaskRequest: AWSEncodableShape {
        /// Specifies the Amazon Resource Name (ARN) of an Amazon CloudWatch log group for monitoring your task. For Enhanced mode tasks, you must use /aws/datasync as your log group name. For example:  arn:aws:logs:us-east-1:111222333444:log-group:/aws/datasync:*  For more information, see Monitoring data transfers with CloudWatch Logs.
        public let cloudWatchLogGroupArn: String?
        /// Specifies exclude filters that define the files, objects, and folders in your source location that you don't want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
        public let excludes: [FilterRule]?
        /// Specifies include filters define the files, objects, and folders in your source location that you want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
        public let includes: [FilterRule]?
        /// Configures a manifest, which is a list of files or objects that you want DataSync to transfer. For more information and configuration examples, see Specifying what DataSync transfers by using a manifest. When using this parameter, your caller identity (the IAM role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a manifest configuration, specify this parameter as empty.
        public let manifestConfig: ManifestConfig?
        /// Specifies the name of your task.
        public let name: String?
        public let options: Options?
        /// Specifies a schedule for when you want your task to run. For more information, see Scheduling your task.
        public let schedule: TaskSchedule?
        /// Specifies the ARN of the task that you want to update.
        public let taskArn: String
        /// Specifies how you want to configure a task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports. When using this parameter, your caller identity (the IAM role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a task report configuration, specify this parameter as empty.
        public let taskReportConfig: TaskReportConfig?

        @inlinable
        public init(cloudWatchLogGroupArn: String? = nil, excludes: [FilterRule]? = nil, includes: [FilterRule]? = nil, manifestConfig: ManifestConfig? = nil, name: String? = nil, options: Options? = nil, schedule: TaskSchedule? = nil, taskArn: String, taskReportConfig: TaskReportConfig? = nil) {
            self.cloudWatchLogGroupArn = cloudWatchLogGroupArn
            self.excludes = excludes
            self.includes = includes
            self.manifestConfig = manifestConfig
            self.name = name
            self.options = options
            self.schedule = schedule
            self.taskArn = taskArn
            self.taskReportConfig = taskReportConfig
        }

        public func validate(name: String) throws {
            try self.validate(self.cloudWatchLogGroupArn, name: "cloudWatchLogGroupArn", parent: name, max: 562)
            try self.validate(self.cloudWatchLogGroupArn, name: "cloudWatchLogGroupArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):logs:[a-z\\-0-9]+:[0-9]{12}:log-group:([^:\\*]*)(:\\*)?$")
            try self.excludes?.forEach {
                try $0.validate(name: "\(name).excludes[]")
            }
            try self.validate(self.excludes, name: "excludes", parent: name, max: 1)
            try self.includes?.forEach {
                try $0.validate(name: "\(name).includes[]")
            }
            try self.validate(self.includes, name: "includes", parent: name, max: 1)
            try self.manifestConfig?.validate(name: "\(name).manifestConfig")
            try self.validate(self.name, name: "name", parent: name, max: 256)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9\\s+=._:@/-]+$")
            try self.options?.validate(name: "\(name).options")
            try self.schedule?.validate(name: "\(name).schedule")
            try self.validate(self.taskArn, name: "taskArn", parent: name, max: 128)
            try self.validate(self.taskArn, name: "taskArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):datasync:[a-z\\-0-9]*:[0-9]{12}:task/task-[0-9a-f]{17}$")
            try self.taskReportConfig?.validate(name: "\(name).taskReportConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogGroupArn = "CloudWatchLogGroupArn"
            case excludes = "Excludes"
            case includes = "Includes"
            case manifestConfig = "ManifestConfig"
            case name = "Name"
            case options = "Options"
            case schedule = "Schedule"
            case taskArn = "TaskArn"
            case taskReportConfig = "TaskReportConfig"
        }
    }

    public struct UpdateTaskResponse: AWSDecodableShape {
        public init() {}
    }
}

// MARK: - Errors

/// Error enum for DataSync
public struct DataSyncErrorType: AWSErrorType {
    enum Code: String {
        case internalException = "InternalException"
        case invalidRequestException = "InvalidRequestException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize DataSync
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// This exception is thrown when an error occurs in the DataSync service.
    public static var internalException: Self { .init(.internalException) }
    /// This exception is thrown when the client submits a malformed request.
    public static var invalidRequestException: Self { .init(.invalidRequestException) }
}

extension DataSyncErrorType: AWSServiceErrorType {
    public static let errorCodeMap: [String: AWSErrorShape.Type] = [
        "InternalException": DataSync.InternalException.self,
        "InvalidRequestException": DataSync.InvalidRequestException.self
    ]
}

extension DataSyncErrorType: Equatable {
    public static func == (lhs: DataSyncErrorType, rhs: DataSyncErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension DataSyncErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
